2010-09-22 112 views
3

我调试在基于GObject的应用程序的引用泄漏。 GObject的有一个简单的内置的机制,以帮助这些事情:你可以在gobject.c设置g_trap_object_ref变量,你关心的对象,则该对象的每个ref或UNREF将达到一个断点指令(通过G_BREAKPOINT()) 。我可以指示gdb运行命令来响应SIGTRAP吗?

所以果然,程序没有得到停止,用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,不给我做什么特别有趣的选项。有没有一个好的方法来做到这一点?

(我知道,还有其他的方法来调试参考泄漏,如g_object_ref()g_object_unref()在对象的ref_count场,refdbg,脚本定期断点设置观察点,我现在就要去那些尝试。我正在寻找一种方法来编写对SIGTRAP的响应脚本,它可能会在其他情况下有用,如果gdb不支持此功能,我会很惊讶。)

回答

3

GDB不支持它。

一般来说,附加命令脚本信号变得毫无意义 - 你的程序可以在任何数量的场所接受SIGTRAP,和该命令将不知道特定SIGTRAP是否排在预期范围内或没有。

+0

令人痛心的,但我想并非完全出乎意料。 – wjt 2010-09-24 16:44:38

4

你想表现出一定的值,并继续执行程序?在这种情况下,只要定义显示你所感兴趣的值,继续执行和递归调用自身的宏:

define c 
echo do stuff\n 
continue 
c 
end 
+0

哦,这是一个整洁的kludge! – wjt 2010-09-24 21:45:21

相关问题