1.設置linux系統可以生成dump
ulimit -c unlimited
2.編譯程序可以爲debug版本
gcc utest.c -o utest -lpthread -lm -Wall -O0 -g
3.運行生成dump
非法指令 (核心已轉儲)
在目錄下,生成core文件
4.用gdb打開core文件
gdb utest core
其中utest是我第2步編譯處理的可執行文件
5.輸入bt可見調用棧
(gdb) bt
#0 0x00007f5dd6da8631 in com_funs_init_ip_filter () from /usr/lib/libuavs2e.so
#1 0x00007f5dd6dfa2a0 in avs2_lib_create () from /usr/lib/libuavs2e.so
#2 0x00000000004032f9 in main (argc=3, argv=0x7fffbc1b8a98) at utest.c:668
6.查看彙編信息
x/30i $rip
或者直接地址
x/30i 0x00007f5dd6da8631
可見彙編指令是
vextracti128 $0x1,%ymm2,0x90(%rax)
7.編譯c文件測試彙編指令
#include <stdio.h>
int main()
{
int a = 0;
asm volatile (
"vextracti128 $0x1,%%ymm2,0x90\n"
: "=r"(a)
);
return 0;
}
8.執行發現同樣問題,確認是彙編指令導致,查詢cat /proc/cpuinfo的flags支持的指令集。
vextracti128是avx2,如果cpu的flags不支持該指令集,則會出現非法指令。