最近因爲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