使用 gdb 处理信号

Handling signals with gdb

提问人:Adri C.S. 提问时间:5/23/2014 更新时间:5/23/2014 访问量:4536

问:

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

阅读 gdb 文档后,我找到了该命令,因此我尝试将其应用于 SIGKILL 信号:handle

(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. 

一旦发出信号,应该以某种方式捕获它,打印消息,停止执行,不要让应用程序杀死自己,对吧?SIGKILLgdb

问题是这不会发生,应用程序会终止。

你知道我怎样才能捕捉到信号吗?

有用的信息:

  • 发出信号时运行的代码段在另一个线程中执行。
  • GDB 版本:4.4.3
  • G++ 版本:7.1
C++ 多线程 GDB 信号 ubuntu-10.04

评论


答:

9赞 Klaus 5/23/2014 #1

来自 unix signal(7) 手册页:

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

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

评论

0赞 Adri C.S. 5/23/2014
伟大。我必须找到另一种获取信息的方法。谢谢@Klaus,我应该从一开始就检查手册页,省去你的工作。