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

如何有条件地忽略GDB中的SIGTRAP?,gdb,Gdb,我正在调试一个程序,它会在特定的例程中触发一个不需要的信号陷阱。此信号在库中触发,但回溯中始终显示相同的调用方。如果调用方是[某个函数],我如何告诉GDB忽略这个信号,而不是打断它 我曾尝试使用跳过函数[某些函数]甚至跳过文件[触发SIGTRAP的文件](from),但GDB仍然在这一行中断。而且continue似乎也不支持条件句。我会选择任何不需要修改调试程序的解决方案,包括用于GDB的Python脚本。如果相关,您还可以假设在触发SIGTRAP之前,将错误写入stderr 两年前,有人问。这

我正在调试一个程序,它会在特定的例程中触发一个不需要的信号陷阱。此信号在库中触发,但回溯中始终显示相同的调用方。如果调用方是[某个函数],我如何告诉GDB忽略这个信号,而不是打断它

我曾尝试使用
跳过函数[某些函数]
甚至
跳过文件[触发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的解决方案正是我想要的。中描述了您建议的一个稍微复杂的版本。如果您感兴趣,请看一看!