如何有条件地忽略GDB中的SIGTRAP?
我正在调试一个程序,它会在特定的例程中触发一个不需要的信号陷阱。此信号在库中触发,但回溯中始终显示相同的调用方。如果调用方是[某个函数],我如何告诉GDB忽略这个信号,而不是打断它 我曾尝试使用如何有条件地忽略GDB中的SIGTRAP?,gdb,Gdb,我正在调试一个程序,它会在特定的例程中触发一个不需要的信号陷阱。此信号在库中触发,但回溯中始终显示相同的调用方。如果调用方是[某个函数],我如何告诉GDB忽略这个信号,而不是打断它 我曾尝试使用跳过函数[某些函数]甚至跳过文件[触发SIGTRAP的文件](from),但GDB仍然在这一行中断。而且continue似乎也不支持条件句。我会选择任何不需要修改调试程序的解决方案,包括用于GDB的Python脚本。如果相关,您还可以假设在触发SIGTRAP之前,将错误写入stderr 两年前,有人问。这
跳过函数[某些函数]
甚至跳过文件[触发SIGTRAP的文件]
(from),但GDB仍然在这一行中断。而且continue
似乎也不支持条件句。我会选择任何不需要修改调试程序的解决方案,包括用于GDB的Python脚本。如果相关,您还可以假设在触发SIGTRAP之前,将错误写入stderr
两年前,有人问。这还没有得到任何答案,因此我希望问题的较弱版本(忽略某些特定的SIGTRAP)是可以回答的。您可以从源头(触发SIGTRAP信号)或在事实发生后(请参阅关于忽略某些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++
)。这假设指令是一个字节。我会尝试捕获所有信号
,然后在该指令上使用命令
更改SIGTRAP
的句柄传递设置,具体取决于是否应忽略此设置。我不知道这是否有效。另一种尝试是使用Python停止
事件处理程序,如果停止不是所需的,则向命令循环发布continue
。@TomTromey感谢您的评论!我试图避免捕获信号SIGTRAP
(更不用说all
)因为它捕获了太多。下面Lekensteyn的解决方案正是我想要的。中描述了您建议的一个稍微复杂的版本。如果您感兴趣,请看一看!