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

How to conditionally ignore SIGTRAP in 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)是可以回答的。

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

如果您有如下代码:

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

那么你可以立即用命令设置断点到return:

break debug_break
commands
 return
 continue
end

如果你不能return 因为代码是混合的:

/* 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++)。这假设指令是一个字节。