我调试在基于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不支持此功能,我会很惊讶。)
令人痛心的,但我想并非完全出乎意料。 – wjt 2010-09-24 16:44:38