我正在调试基于 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/

10-12 12:47