如何有条件地忽略 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++
)。这假设指令是一个字节。
我正在尝试调试在特定例程中触发不需要的 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++
)。这假设指令是一个字节。