2011-06-01 57 views
4

是否有可能让gdb将某些东西记录到终端而不是破坏它?例如,我想在某些方法上设置一个“断点”,并在每次调用该方法时使gdb自我打印以及参数。基本上我想在没有实际重新编译的情况下将打印语句插入任意位置。gdb:记录的东西,而不是打破?

感谢您的任何建议


这是我后至今,这些有益的意见有:

define logFoo 
b fooMethod 
commands 
po self 
end 
end 

GDB似乎并不喜欢嵌套结束语句虽然。有什么想法吗?

+0

为了将来的参考,双重目的是一个已知的错误。解决方法是将内部块放在单独的文本文件中并使用源来加载它。 – 2011-06-01 23:49:39

回答

9

您可以使用Breakpoint Command Lists。有一个例子是如何做到的。

例如,这里是你如何可以使用 断点命令在进入打印x的值 为foo每当x是 阳性。

break foo if x>0 
commands 
silent 
printf "x is %d\n",x 
cont 
end 
+0

真棒。有一件事。我想打破的符号(方法)是一件很常见的事情,所以它可能需要设置许多断点。如何将命令附加到每个命令而无需手动执行100次? – 2011-06-01 19:49:57

0

不,这是不可能的。您只能勾选代码和机器码的符号。如果你想记录输出,你需要一个记录功能。

如果您正在跟踪特定错误,请尝试使用条件断点和监视变量。

编辑:

即使没有直接洛也可能是使用GDB command files

+0

感谢您的回复。我很难相信这是不可能的。我可以很容易地做一些事情,比如break hitTest:withEvent:,然后当它破解为自我时,p指向我想要的信息。这怎么能不自动让gdb直接打印这些,而不让我在每次断裂时都实际告诉它呢? – 2011-06-01 19:22:31

+0

这听起来很疯狂,可能有机会使用某种宏执行你想要的操作,但它仍然不能直接记录。结帐:http://tromey.com/blog/?p=548 – grundprinzip 2011-06-01 19:29:47

2

使用断点像往常一样,并设置宏登录并继续替代:

define c 
print "foo" 
cont 
c 
end 
+0

不错。你能详细说一下吗?所以我可以在我的gdbinit文件中定义这个宏,但是如何告诉gdb在发生断点时调用这个宏? – 2011-06-01 19:29:58

+0

只要你第一次打断点就叫它。 – ninjalj 2011-06-01 19:52:52

+0

为什么'cont'和'c'在这里不一样? – daisy 2014-06-29 07:21:36