在Linux下捕获SIGKILL的调试程序

时间:2014-08-15 11:46:07

标签: c++ c linux gdb

我在Linux下编写了一个使用AVX指令的小型C ++程序。但该程序收到SIGKILL信号并退出。似乎原因是一些非法指令或错误的值传递给指令。我需要了解它收到的程序的哪一点SIGKILL(最好是什么指令)。但是,当我在GDB中运行程序时,程序会在收到SIGKILL并且无法调试时退出。我试着设置:

    (gdb) handle SIGKILL stop print nopass

但程序仍然接收SIGKILL并在我调试之前退出。你有任何提示如何使用它吗?

1 个答案:

答案 0 :(得分:-1)

signal(7)手册页告诉非法机器指令(或illegal opcode),

   SIGILL        4       Core    Illegal Instruction

发送信号。请注意,SIGILL 不是 SIGKILL(字母K会产生重大影响。)

回想一下,并非所有处理器都了解AVX。 (对于那些不支持AVX的人,它可能是非法的操作码)。输入cat /proc/cpuinfo(或grep avx /proc/cpuinfo)以了解您的处理器是否接受它。见proc(5)

所以我猜你的程序正在获取SIGILL not SIGKILL)信号。

您可以抓住SIGILL(但无法抓住SIGKILL)。

我在this answer (about SIGSEGV)中解释的内容适用于SIGILL;使用一些非常棘手的机器和系统特定的C代码,您可能捕获SIGILL 并确保从信号处理程序返回时(与SA_SIGINFO一起安装并且深入处理ucontext_t*第三个参数)执行在非法指令之外继续。

您可以配置gdb明智地处理SIGILL。阅读GDB文档的signals chapter,您可能需要handle SIGILL和/或p $_siginfo命令。