提问人:Adri C.S. 提问时间:5/23/2014 更新时间:5/23/2014 访问量:4536
使用 gdb 处理信号
Handling signals with gdb
问:
我正在调试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.
一旦发出信号,应该以某种方式捕获它,打印消息,停止执行,不要让应用程序杀死自己,对吧?SIGKILL
gdb
问题是这不会发生,应用程序会终止。
你知道我怎样才能捕捉到信号吗?
有用的信息:
- 发出信号时运行的代码段在另一个线程中执行。
- GDB 版本:4.4.3
- G++ 版本:7.1
答:
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,我应该从一开始就检查手册页,省去你的工作。
评论