文档章节

Illegal instruction

RoyceInWh
 RoyceInWh
发布于 2016/06/20 16:02
字数 861
阅读 571
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

1  现象

Kernel panic - not syncing: Attempted to kill init!
[<c0069278>] (unwind_backtrace+0x0/0xe4) from [<c0315360>] (panic+0x68/0x190)
[<c0315360>] (panic+0x68/0x190) from [<c0078188>] (do_exit+0xb0/0x724)
[<c0078188>] (do_exit+0xb0/0x724) from [<c00788bc>] (do_group_exit+0xc0/0xf0)
[<c00788bc>] (do_group_exit+0xc0/0xf0) from [<c0084b84>] (get_signal_to_deliver+0x3cc/0x42c)
[<c0084b84>] (get_signal_to_deliver+0x3cc/0x42c) from [<c0066214>] (do_signal+0xa0/0x5c4)
[<c0066214>] (do_signal+0xa0/0x5c4) from [<c0066750>] (do_notify_resume+0x18/0x4c)
[<c0066750>] (do_notify_resume+0x18/0x4c) from [<c0063e54>] (work_pending+0x24/0x28)

2 关于“illegal instruction”

illegal instruction,即SIGILL, 是POSIX标准中提供的一类错误。 从名字上看,SIGILL是启动的某个进程中的某一句不能被CPU识别成正确的指令。 此类错误是由操作系统发送给进程的,在进程试图执行一些形式错误、未知或者特权指令时操作系统会使用SIGILL信号终止程序。 SIGILL对应的常数是4.

3 造成SIGILL的原因

3.1 将不正确的数据写入代码段

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

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

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

3.2 指令集的演进

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

3.3 工具链bug

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

3.4访存对齐或浮点数格式问题

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

4 错误排查指南

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

常见原因:编译器选择不正确, arch 和代码指令集不正确

本文转载自:http://blog.csdn.net/jingxia2008/article/details/7793369

RoyceInWh

RoyceInWh

粉丝 5
博文 240
码字总数 1282
作品 0
武汉
程序员
私信 提问
illegal instruction问题窥探

最近调程序,出现illegal instruction问题,没有头绪。 索性把illegal instruction好好窥探一下。 Table of Contents 1 现象 2 关于“illegal instruction” 3 造成SIGILL的原因 4 错误排查指...

AlphaJay
2012/07/23
497
0
ffmpeg移植到arm

那个打叉的语句打印不出来,是因为avformat_find_stream_info执行这个语句,就出现Illegal instruction, 在虚拟机上 运行可以通过,但是在arm上运行,就出现Illegal instruction,大神 帮帮...

邂逅萍聚
2016/12/22
746
1
ubuntu系统连接jz2440开发板

我在ubuntu系统下将写好的程序拷贝到jz2440开发板上 怎么不能执行 一直出现 Illegal instruction

bookline
2014/06/16
427
2
Rust runtime error: Illegal instruction: 4

use std::intrinsics; [deriving(Show)] struct NewType<'a, T: 'a> { a:int, b:String, v: &'a T}fn main() { let t: NewType<int> = unsafe{ intrinsics::init()}; println!("{}", t); // ......

曾赛
2014/12/25
363
0
Numpy在云虚拟机上crash问题

在python中使用Pandas和Numpy库创建一个Pandas DataFrame是一个常见的操作,但就是这一个常见的操作也会在特定的场景下遇到问题。 笔者在使用Pandas DataFrame时,遇到了core dump的问题。去...

biggeng
2017/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何更改iOS应用程序的名称?

我前几天用一个愚蠢的开发代码名称开始了一个iPhone项目,现在我想改变项目的名称,因为它已经接近完成了。 但是我不知道如何使用Xcode来做这件事,尝试在info.plist文件中更改应用程序的名称...

技术盛宴
20分钟前
2
0
关于win10tensorflow的配置(CPU+GPU)

主要内容 CPU篇 GPU篇 【前期准备与注意事项】 环境:window1064位+python36(37)+CUDA9.0+cuDNN7.6+tensorflow_gpu-1.12.0 软件:anaconda+pycharm 硬件:有nvidia显卡的笔记本或台式(非A...

放只虎归个山
29分钟前
1
0
C#中的多行字符串文字

有没有一种简单的方法可以在C#中创建多行字符串文字? 这是我现在所拥有的: string query = "SELECT foo, bar"+ " FROM table"+ " WHERE id = 42"; 我知道PHP有 <<<BLOCKBLOCK; C#是......

javail
36分钟前
3
0
微信支付之小微商户扫盲!支持信用卡,免营业执照!

微信支付商户申请面向线下小微商户开放,符合条件的微信支付服务商可为小微商户发起接入申请。无需营业执照。 小微商户日收款额度为5万元~30万元 。 信用卡支付日限额为1千;月限额1万。 结算...

吴伟祥
今天
4
0
大话SDWebImage(三)-- 图片下载层

四、图片下载层 SDWebImageDownloader是处理图片下载的类 4.1 图片下载步骤 首先介绍下dispatch_barrier,GCD中的dispatch_barrier目的是在并发队列实现串行的效果,创建下载任务SDWebImageD...

aron1992
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部