GDB如何处理SIGSEGV

时间:2016-02-17 05:13:46

标签: c++ gdb signals handle sigsegv

当调试C ++程序发出带有gdb的SIGSEGV时,可以处理该信号并要求nostop。

gdb如何处理这种情况?

已搜索过gdb源代码,无法找到起点。

3 个答案:

答案 0 :(得分:1)

您无法自动忽略SIGSEGV。无论如何,我也不建议这样做。虽然你可以让gdb忽略信号并且不将它传递给程序,但是一旦信号处理程序返回并且导致无限循环,内核将尝试重新运行有问题的指令。有关详细信息,请参阅this answer

解决此问题的一种方法是跳过指令或更改寄存器值,使其不会出现段错误。该链接显示了设置寄存器的示例。您还可以使用jump命令跳过指令。

答案 1 :(得分:0)

这实际上是操作系统所做的事情。在Windows上,如果程序附加了调试器并且抛出了异常,Windows将询问调试器是否要处理它。如果/当它下降时,它将它传递给程序。如果程序没有处理它,Windows会再次将它传递给调试器。

答案 2 :(得分:0)

  

可以处理信号并要求nostop。

目前还不清楚你是否希望GDB处理信号或程序本身。

如果是后者,gdb handle SIGSEGV nostop noprint pass就会这样做。