现象描述:

项目开发过程中,遇到一次开服宕机的现象,GDB查看core文件的堆栈很奇怪,F0层为:

mMonsterSpeTabble[idx]=(float)pow(1.3,idx)

外层是一个循环语句,idx从1循环到50
print变量idx为0,数组大小为50,也不会越界,只能猜想是pow函数出错.于是用gdb重新打开并执行程序,下断点单步调试,发现执行到这一句之后,程序奔溃,抛出SIGILL异常,并伴有"illegal instruction"的提示

原因解释:

google了一下这个异常信号量,发现是与CPU指令集有关.从名字上看,SIGILL是启动的某个进程中的某一句不能被CPU识别成正确的指令.此类错误是由操作系统发送给进程的,在进程试图执行一些形式错误、未知或者特权指令时操作系统会使用SIGILL信号终止程序。 SIGILL对应的常数是4.联想到最近正好有同事在修改编译选项,经过询问,果然是因为这个原因.在编译的时候加入了avx(高级向量扩展指令集)选项,而运行程序的VMware虚拟机版本太低,没有支持这项虚拟化的CPU指令,所以运行到pow函数的时候,操作系统就发出中断信号了

扩展:

造成SIGILL的原因

1 将不正确的数据写入代码段
进程在代码段中的数据是要被作为一个指令执行的。 若不小心覆盖了已有的代码段,可能会得到错误格式的指令。 这种错误尤其在Just-In-Time即时编译器中最可能出现。

同样,如果不小心覆盖了栈上活跃记录中的返回地址,程序就可能根据这个错误地址,执行没有意义的内存中的数据,进而操作。

进一步可以认为,任何导致数据错误的问题都可能带来illegal instruction问题。比如硬盘发生故障。

2 指令集的演进
比如SIMD指令,自从奔腾4开始有MMX,X86的芯片就开始不停的增加和拓宽SIMD支持,SSE、SSE2、SSE3、SSE42、AVX、AVX2。 默认情况下,很多编译器都在O2或者O3中开了自动向量化,这就导致很多在新体系结构中编译的可执行程序,在老机器上运行时会有illegal instruction问题。

3 工具链bug
对于普通C语言通过编译器生成的可执行程序。一般都已经通过严格的测试,不会随便发生这种问题。 所以如果你遇到这种错,并且试过了静态链,而且程序中没有嵌入式汇编,基本可以断定是工具链出了问题。 编译器?汇编器或者链接器。

4 访存对齐或浮点数格式问题
根据经验,请注意出现错误的指令可能和访存地址指令有关。 另外,浮点数的格式是否符合IEEE的标准也可能会有影响。

错误排查指南
程序中有没有特权指令、或者访问特权寄存器
有没有将在较新CPU上编译得到的可执行文件拿到老CPU上运行
程序中有没有嵌入式汇编,先检查。
一般编译器很少会生成有这种问题的代码
X86平台上要尤其注意64位汇编指令和32位汇编指令的混用问题
程序有在进程代码段空间写数据的机会吗?
栈操作够安全吗?
注意程序的ABI是否正确
尤其是动态链和静态链是否处理的正确,尽量避免动态链的可执行文件调用错误库的问题(ARM的EABI,MIPS的N32/O32/N64都很可能出这种问题)
用的工具链靠谱吗?

参考链接:

点击打开链接

Illegal Instruction小谈相关推荐

  1. EMOS在线协同办公小程序解决Illegal instruction

    人脸识别小程序 上dokcer输入 nohup python3 -c "from app import app;"> log.out 2>&1 & 报错 ...

  2. 非法指令(Illegal Instruction)问题定位

    关键词:Illegal Instruction.SIGILL等. 进程在运行过程中会收到SIGILL信号,此类错误是由操作系统发送给进程的. SIGILL是某个进程中的某一句不能被CPU识别指令,这些 ...

  3. 故障分析 | MongoDB 5.0 报错 Illegal instruction 解决

    作者:任仲禹 爱可生 DBA 团队成员,擅长故障分析和性能优化,文章相关技术问题,欢迎大家一起讨论. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. ...

  4. PHP的echo和print小谈

    自学php快2个多月了.学着做点东西,基本函数用的还凑合,用help点开加search找.基本没问题 不过那个php主页的说明实在是很模糊,很多参数说完了还是看不懂,有实践才有真理.这点到哪里都没有错 ...

  5. 关于qte illegal instruction的一些心得

    最近半个月在按照天嵌的TQ2440做qte方面的移植工作,去年刚拿到板子的时候用的是qt4.5的源码,那时还能顺利的移植到arm板上,可是最近也是按照天嵌手册来移植,当我编译一个qt测试程序,在arm ...

  6. illegal instruction错误

    原文地址:http://www.kuche361.com/ht/view/id-39165 这是个臭名昭著的问题,试了很多方法,也没有解决. 7月15日~16日加起来搞了一天,把4.6.3重新编译了两 ...

  7. [ARM]【编译】【实践】 - 浮点编译选项NEON引发的Skia的库Illegal instruction运行错误和解决办法

    前言,ARM编译器选项除了优化系统代码性能外,往往还具备其他一些设定,例如警告级别,和指令集的扩展 本文论述工作中遇到的一个编译开源浏览器chromine遇到的问题,由编译选项引发的可执行文件的Ill ...

  8. HTTP的⼏种请求⽅法及⽤途小谈(面试)

    HTTP的⼏种请求⽅法及⽤途小谈(面试) 1.GET ⽅法 其目的发送⼀个请求来取得服务器上的某⼀资源. 2.POST ⽅法 向 URL 指定的资源提交数据或附加新的数据. 3.PUT ⽅法 跟 PO ...

  9. linux运行非法指令,illegal instruction非法指令的解决思路

    我移植x264到开发板上,arm linux系统.移植好后将库都拷贝到nfs文件系统上,可是执行后出现illegal instruction的错误. 可能是x264配置问题,我的x264开始的编译配置 ...

最新文章

  1. 进一步提升用户信息安全保护意识 小米安全与隐私宣传月完满落幕
  2. 呵呵,你开心就好!——AI向杠精宣战
  3. Taro+react开发(94):问答模块01
  4. PHP生成zip压缩包
  5. Object强转为实体类类型失败!!!!!!
  6. npm init @vitejs/app 到底干了什么
  7. 阿里云国际站服务器怎么样
  8. VSCode沙绿色主题设置
  9. P3373(线段树2)
  10. 数字电视业务PSI/SI学习
  11. 技能Get·PC及手机微信聊天记录的备份与还原
  12. 软件测试人员的优势,软件测试师 求职八大优势
  13. ZJNU——1259:幸运数字(找规律题)
  14. 装机不求人,适合“懒人”的系统安装方法
  15. Hi3518EV200+PS3210调试经验总结
  16. MATLAB中将.csv格式的数据批量转化为.mat格式
  17. 详解Spring的循环依赖
  18. 2021年java开发本科应届生平均薪资曝光,25k是人均水平?
  19. 零基础可以学云计算运维吗?怎样从才可以学好?
  20. 平法matlab怎么表示,梁钢筋平法的基本知识

热门文章

  1. c++:算术运算符、赋值运算符、比较运算符、逻辑运算符
  2. 基于ssm汽车租赁汽车服务管理系统
  3. 银河麒麟高级服务器操作系统V10上编译安装vscode失败的艰辛历程
  4. 使用MindStudio 进行Deit 模型推理迁移
  5. burp suite中文乱码解决方法
  6. tensorflow estimator使用总结
  7. 浙大python教材_浙大学霸用这套Python教程自学,8天开发12款游戏,堪称经典课程...
  8. Java对象创建的方式(简洁明了)
  9. js修改复制粘贴板上的内容(从网页复制表格的时候多复制了一行)
  10. 服务器,虚拟主机是什么?