我可以指示gdb运行命令以响应SIGTRAP吗?

时间:2010-09-22 15:09:38

标签: linux debugging gdb

我在基于GObject的应用程序中调试引用泄漏。 GObject有一个简单的内置机制来帮助解决这些问题:你可以将gobject.c中的g_trap_object_ref变量设置为你关心的对象,然后该对象的每个ref或unref都会遇到断点指令(通过G_BREAKPOINT())。

可以肯定的是,程序确实停止了,gdb报告:

Program received signal SIGTRAP, Trace/breakpoint trap.
g_object_ref (_object=0x65f090) at gobject.c:2606
2606      old_val = g_atomic_int_exchange_and_add ((int *)&object->ref_count, 1);
(gdb) _

这是一个很好的开始。现在,通常我会编写一些命令,在我使用commands 3手动设置的断点处运行(比如断点3)。但是SIGTRAP的等价物,即handle SIGTRAP,并没有让我选择做任何特别有趣的事情。有没有办法做到这一点?

(我知道还有其他方法来调试引用泄漏,例如在对象的ref_count字段上设置观察点,refdbg,在g_object_ref()g_object_unref()上编写常规断点的脚本。我现在要尝试那些。我正在寻找一种方法来编写对SIGTRAP的回复。它可能在其他情况下也很有用,如果gdb没有我会感到惊讶不支持这个。)

2 个答案:

答案 0 :(得分:5)

您想显示一些值并继续执行该程序吗?在这种情况下,只需定义一个显示您感兴趣的值的宏,继续执行并递归调用自身:

 define c
 echo do stuff\n
 continue
 c
 end

答案 1 :(得分:3)

GDB不支持它。

通常,将命令脚本附加到信号没有意义 - 您的程序可能在任意数量的地方接收SIGTRAP,并且命令将不知道特定SIGTRAP是否进入预期的背景与否。