我正在为 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
最佳答案
来自 unix signal(7) 手册页:
The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.
因此调试器可以设置处理程序,但这没有任何意义。操作系统直接执行所需的操作。如果可以从应用程序处理 SIGKILL,则操作系统没有机会终止损坏的应用程序。出于这个原因,SIGKILL 有点特殊 :-)
关于c++ - 使用 gdb 处理信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23826676/