2014-05-23 119 views
4

我正在调试Ubuntu 10.04的C++应用程序,它有时会收到SIGKILL信号。 我想捕获信号,并阻止它杀死执行,只是为了看看我能否在该时刻获得应用程序状态的一些有用信息。使用gdb处理信号

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
  • 克++版本: 7.1

回答

5

从UNIX 信号(7)手册页:

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

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

+0

太好了。我必须找到另一种获取信息的方式。谢谢@克劳斯,我应该从一开始就检查手册页,并让你工作。 –