我正在调试基于 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 不支持这一点,我会感到惊讶。) 最佳答案
GDB 不支持它。
一般来说,将命令脚本附加到信号上没有什么意义——您的程序可能会在任意数量的地方接收 SIGTRAP
,并且该命令将不知道特定的 SIGTRAP
是否出现在预期的上下文中。
关于linux - 我可以指示 gdb 运行命令来响应 SIGTRAP 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3770675/