我在Linux下编写了一个使用AVX指令的小型C ++程序。但该程序收到SIGKILL
信号并退出。似乎原因是一些非法指令或错误的值传递给指令。我需要了解它收到的程序的哪一点SIGKILL
(最好是什么指令)。但是,当我在GDB中运行程序时,程序会在收到SIGKILL
并且无法调试时退出。我试着设置:
(gdb) handle SIGKILL stop print nopass
但程序仍然接收SIGKILL并在我调试之前退出。你有任何提示如何使用它吗?
答案 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
命令。