【问题标题】:How GDB handles SIGSEGVGDB 如何处理 SIGSEGV
【发布时间】:2016-02-17 05:13:45
【问题描述】:

在调试 C++ 程序时,使用 gdb 发出 SIGSEGV,可以处理信号并要求 nostop。

gdb 如何处理这种情况?

搜索了gdb源码,没找到起点。

【问题讨论】:

    标签: c++ gdb signals handle segmentation-fault


    【解决方案1】:

    您不能自动忽略 SIGSEGV。无论如何,我也不建议这样做。尽管您可以让 gdb 忽略该信号而不将其传递给程序,但一旦信号处理程序返回并导致无限循环,内核将尝试重新运行有问题的指令。请参阅this answer 了解更多信息。

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

    【讨论】:

    • 是的,无论如何都理解处理信号,问题是 gdb 是如何自己处理的
    【解决方案2】:

    可以处理信号并要求nostop。

    不清楚您是希望 GDB 处理信号还是程序本身。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,无论如何都理解处理信号,问题是 gdb 是如何自己处理的
      猜你喜欢
      • 2021-11-02
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2015-02-28
      • 2018-07-26
      相关资源
      最近更新 更多