我正在尝试调试在特定例程中触发不需要的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)是可以回答的。
答案 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++
)。这假设指令是一个字节。