linux遇到非法指令( Illegal instruction)的處理方法

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不支持該指令集,則會出現非法指令。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章