【问题标题】:Handling signals with gdb使用 gdb 处理信号
【发布时间】:2014-07-12 15:54:15
【问题描述】:

我正在为 Ubuntu 10.04 调试一个 C++ 应用程序,该应用程序有时会收到 SIGKILL 信号。 我想捕捉信号并阻止它终止执行,只是想看看我是否能在那个精确的时刻获得一些关于应用状态的有用信息。

阅读gdb documentation我发现handle命令,所以我尝试将它应用到SIGKILL信号:

(gdb) handle SIGKILL stop nopass
Signal        Stop  Print   Pass to program Description
SIGKILL       Yes   Yes     No              Killed

所以,正如我正确理解的那样:

stop
    GDB should stop your program when this signal happens. This implies the print keyword as well. 
print
    GDB should print a message when this signal happens. 
nopass
    GDB should not allow your program to see this signal. 

一旦发出SIGKILL 信号,gdb 应该以某种方式捕获它,打印消息,停止执行并且不要让应用程序自行终止,对吗?

问题是这并没有发生,应用程序终止了。

你知道我如何捕捉信号吗?

有用信息:

  • 发出信号时正在运行的代码在另一个线程中执行。
  • gdb 版本: 4.4.3
  • g++ 版本: 7.1

【问题讨论】:

    标签: c++ multithreading gdb signals ubuntu-10.04


    【解决方案1】:

    来自 unix signal(7) 手册页:

      The  signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
    

    所以调试器可以设置处理程序,但这没有任何意义。操作系统直接执行所需的操作。如果可以从应用程序处理 SIGKILL,则操作系统没有机会终止损坏的应用程序。出于这个原因,SIGKILL 有点特殊 :-)

    【讨论】:

    • 太棒了。我将不得不找到另一种获取信息的方法。谢谢@Klaus,我应该从一开始就检查手册页,让你省去工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2013-06-07
    相关资源
    最近更新 更多