我在基于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没有我会感到惊讶不支持这个。)
答案 0 :(得分:5)
您想显示一些值并继续执行该程序吗?在这种情况下,只需定义一个显示您感兴趣的值的宏,继续执行并递归调用自身:
define c
echo do stuff\n
continue
c
end
答案 1 :(得分:3)
GDB不支持它。
通常,将命令脚本附加到信号没有意义 - 您的程序可能在任意数量的地方接收SIGTRAP
,并且命令将不知道特定SIGTRAP
是否进入预期的背景与否。