如何有条件地忽略GDB中的SIGTRAP?

时间:2015-10-24 09:38:58

标签: gdb

我正在尝试调试在特定例程中触发不需要的SIGTRAP的程序。此信号在库中触发,但同一调用者始终显示在回溯中。如果调用者是[某种功能]而不是打破它,我怎么能告诉GDB忽略这个信号呢?

我尝试使用skip function [some function]甚至skip file [file that triggers SIGTRAP](来自5.3 Skipping Over Functions and Files),但GDB仍然在那条线上破产。并且continue似乎也不支持条件。我会采取任何不需要修改调试程序的解决方案,包括GDB的Python脚本。如果相关,您还可以假设在触发SIGTRAP之前将错误写入stderr

两年前,有人问How can I make GDB stop at SIGTRAP only at breakpoints?。这没有得到任何答案,所以我希望问题的弱点(忽略一些特定的SIGTRAP)是可以回答的。

1 个答案:

答案 0 :(得分:4)

您可以在源头(SIGTRAP信号的触发器)或事件发生后解决问题(请参阅this answer忽略某些SIGTRAP)。下面我将解释如何处理第一种情况(避免触发)。

如果您有以下代码:

void debug_break() {
    asm("int3");
}

然后您可以使用命令设置断点以立即返回:

break debug_break
commands
 return
 continue
end

如果由于代码混合而无法返回:

/* some code here */
asm("int3");
print_error();

然后您可以使用jump命令跳过。假设int3行是1337,请使用:

break file.c:1337
commands
 j +1
 c
end

如果东西在一行(asm("int3"); print_error();上,则将行跳转更改为递增程序计数器(set $pc++)。这假设指令是一个字节。