c++ - 使用 gdb 处理信号

标签 c++ multithreading gdb signals ubuntu-10.04

我正在为 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/

相关文章:

c++ - 如何在 C++ 的二维 map 中使用 std::insert?

c++ - 提高 Eigen 性能 - 最佳实践

.net - 多线程单元测试

c# - 内存不足线程 - 性能测试工具

c++ - 如果我重新运行程序,gdb pretty-print 将停止工作

c++ - LoadLibrary调用系统错误wpcap.dll

c++ - 如何创建一个程序来识别最长的子串回文而不考虑字母大小写

c# - 从另一个线程更新 ObservableCollection 的最佳方法是什么?

debugging - 调试器数据库应用程序和查询

c - "cannot collect variable"?