【发布时间】:2016-02-17 05:13:45
【问题描述】:
在调试 C++ 程序时,使用 gdb 发出 SIGSEGV,可以处理信号并要求 nostop。
gdb 如何处理这种情况?
搜索了gdb源码,没找到起点。
【问题讨论】:
标签: c++ gdb signals handle segmentation-fault
在调试 C++ 程序时,使用 gdb 发出 SIGSEGV,可以处理信号并要求 nostop。
gdb 如何处理这种情况?
搜索了gdb源码,没找到起点。
【问题讨论】:
标签: c++ gdb signals handle segmentation-fault
您不能自动忽略 SIGSEGV。无论如何,我也不建议这样做。尽管您可以让 gdb 忽略该信号而不将其传递给程序,但一旦信号处理程序返回并导致无限循环,内核将尝试重新运行有问题的指令。请参阅this answer 了解更多信息。
解决它的一种方法是跳过指令或更改寄存器值,使其不会出现段错误。该链接显示了设置寄存器的示例。您也可以使用jump 命令跳过一条指令。
【讨论】:
可以处理信号并要求nostop。
不清楚您是希望 GDB 处理信号还是程序本身。
如果是后者,gdb handle SIGSEGV nostop noprint pass 会这样做。
【讨论】:
这实际上是操作系统所做的事情。在 Windows 上,如果程序附加了调试器并引发了异常,Windows 将询问调试器是否要处理它。如果/当它拒绝时,它会将其传递给程序。如果程序没有处理它,Windows 会再次将它传递给调试器。
【讨论】: