最近因为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 is an AVX2 only instruction。
YASM确实承认SSE4.2指令,所以这不是问题。你确定你的机器支持SSE4.2吗?它究竟是什么硬件?你可以在模拟器中运行程序,valgrind(支持glibc和gcc中使用的SSE4.2的子集)可能会起作用。 – hirschhornsalz 2012-04-28 10:04:27