最近我因为132退出状态码(128 + 4:程序被信号中断+非法指令信号)而遇到崩溃。以下是我如何找出导致崩溃的指令。
首先,我启用了核心转储:
$ ulimit -c unlimited
有趣的是,我运行二进制文件的文件夹包含一个名为core
. 我不得不告诉 Linux 将 PID 添加到核心转储中:
$ sudo sysctl -w kernel.core_uses_pid=1
然后我运行我的程序并得到一个名为core.23650
. 我用 gdb 加载了二进制文件和核心。
$ gdb program core.23650
一旦我进入 gdb,它就会显示以下信息:
Program terminated with signal SIGILL, Illegal instruction.
#0 0x00007f58e9efd019 in ?? ()
这意味着我的程序由于0x00007f58e9efd019
地址内存中的非法指令而崩溃。然后我切换到asm 布局来检查最后执行的指令:
(gdb) layout asm
>|0x7f58e9efd019 vpmaskmovd (%r8),%ymm15,%ymm0
|0x7f58e9efd01e vpmaskmovd %ymm0,%ymm15,(%rdi)
|0x7f58e9efd023 add $0x4,%rdi
|0x7f58e9efd027 add $0x0,%rdi
是指令vpmaskmovd
导致了错误。显然,我试图在一个不支持 AVX2 指令集的系统上运行一个针对 AVX2 架构的程序。
$ cat /proc/cpuinfo | grep avx2
最后,我确认vpmaskmovd 是仅 AVX2 指令。