Illegal instruction 问题处理

Illegal (iLLegal) instruction 直观解释----非法指令。表面看是CPU在执行指令过程中,发现指令非法,也就是不认识的指令或者无权限的指令。如果只是沿着这个思路,很容易陷入对编译器的信任上。其实,这个问题,也很可能是程序自己造成的。比如使用了嵌入汇编,那么编写者要对使用的指令负责。还比如堆栈、内存出错,此时,访问的指令可能是内存随机的数据或者非指令数据,这同样会导致CPU无法识别。网上看到一篇比较全的分析文章,放在这里供参考:

非法指令(Illegal Instruction)问题定位 - ArnoldLu - 博客园

关于这个问题需要再补充一下:

之前没有经过认真思考,就做出了上述论断,后来仔细想了想,感觉没有那么简单。对于第一种情况,使用嵌入汇编,实际测试,发现如果使用了错误的汇编指令,编译器是不认的。想想也是,嵌入汇编也是一种格式,也有很多种扩展写法,编译器并不是按照类似宏定义的方式,直接信任和使用的,而是需要进行二次处理,保留基本处理流程,重新生成不影响上下文的汇编指令(寄存器使用通盘考虑)。这样一来,想通过嵌入汇编轻松欺骗机器是行不通的。关于嵌入汇编,简单的例子可参考下面的链接:

内联汇编很可怕吗?看完这篇文章,终结它!

继续,对于第二种情况,修改代码指令,也不是简单轻松的事情。现代操作系统都是用了虚拟内存机制,进一步的,大部分都采用了分页机制。那么,对于程序的代码段,操作系统在映射内存页面的时候,会标记这类页面为只读,所以,尝试对代码直接修改,也是行不通的。

对于这一点,也不是绝对的。可以通过mprotect调用,修改页面的读写属性,参考文章:

内核热补丁,真的安全么?

综合上述两点,人为产生非法指令,还需要再思考思考。

第三次补充:在X86下尝试多次均失败后,终于在arm下人为成功产生了上述错误指令提示。具体过程如下:

首先,对程序做了简单处理,增加了如下的异常信号捕获

void signal_handler(int signum) {
   printf("Signal %d (number) captured \n", signum);
}

signal(SIGILL , signal_handler);


上述代码期望在非法指令产生时,由应用捕获,并进一步处理。

然后对于x86,因为简单的错误指令会被编译器识别,所以主要尝试了call和jmp指令。在这两个指令后都附带一个随机地址,可以编译通过。但是,实际运行,都是类似段错误,也就是主要是内存错误。
call因为是类似函数调用,有入栈出栈等操作,段错误还是可以理解的,但是jmp指令是无条件跳转,跳转到的地址包含的内容可能不是有效的代码,比如无法译码。但是,多次尝试,仍然也是报段错误。x86下放弃。

尝试ARM平台。找到了一个跟CPU版本相关的指令,swpb,这是一个存在于早期ARM CPU上的指令,感兴趣的读者可以搜索了解一下。
使用如下嵌入汇编代码

asm volatile("swpb %0,%2,[%3]"
             : "=&r"(ret), "=m" (*ptr)
             : "r"(newval), "r"(ptr)
             : "cc", "memory");    //memory == no cache  |  cc == status register update

编译通过。执行程序,报非法指令。
gdb跟踪调试,发现报非法指令时,的确在swpb指令处。如下图:

Program received signal SIGILL, Illegal instruction.    成功产生非法指令。
这说明,在嵌入式平台上,可能会因为嵌入汇编、编译器版本、连接库等导致出现运行时非法指令。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: "illegal instruction (core dump)" 意思是程序在运行时遇到了非法指令,导致程序崩溃,并生成了一个 "core dump" 文件。这通常是由于程序代码中存在错误或者程序使用了不兼容的硬件或操作系统功能导致的。 ### 回答2: illegal instruction (core dump)是指某个程序在执行时出现了非法指令,并因此导致崩溃,并生成核心转储文件(core dump)。这个错误需要通过分析崩溃现象来确定原因。 首先,我们需要查阅相关的错误日志,以及检查程序运行的相关环境,包括操作系统版本、CPU架构、程序编译器版本等。这有助于我们快速锁定原因。 一般情况下,illegal instruction (core dump)是由于程序在执行时执行了不支持的指令,或是执行了内存损坏的代码造成的。这些情况通常是由程序员在编写代码时没有考虑到特定环境下的限制,或是代码中出现了缺陷导致的。 针对这个错误,我们可以通过以下几个方式进行修复: 1.升级程序编译器或运行环境,并重新编译程序。这能够保证在新的环境下程序能够正确执行。 2.检查代码,确认代码中没有出现不支持的指令或内存损坏等问题。 3.通过使用调试工具,如GDB等,来跟踪程序的执行过程,定位到具体的错误代码,并修改代码以避免出现这些问题。 总之,illegal instruction (core dump)是一个常见的程序错误,需要通过仔细的分析和调试才能够解决。在编写程序时,我们需要考虑到不同运行环境的限制,并尽可能避免出现缺陷,以提高程序的稳定性和可靠性。 ### 回答3: Illegal instruction (core dump)是一种计算机错误。简而言之,计算机执行了无法理解的指令,并且因为这个错误导致程序的终止。这种错误通常会生成一个core dump文件,这个文件包含了程序崩溃时的内存状态,可以用于调试程序。 Illegal instruction错误通常是由于以下几种原因引起的: 1.硬件损坏:如果CPU或者内存损坏或者出现故障,计算机就可能执行不正常的指令,导致Illegal instruction错误。 2.软件更新:如果操作系统或者应用程序发生更新,但是旧程序与新程序不兼容,就可能导致Illegal instruction错误。 计算机会尝试执行无法识别或无法理解的操作码。 3.编译错误:编译器将代码转换成机器指令,如果编译器生成了错误的指令,就可能导致Illegal instruction错误。 如何解决Illegal instruction错误?这需要根据具体情况来定。可能需要检查计算机硬件是否正常,重新安装相关软件,或者对程序进行调试。确保代码正确,任何未定义的行为都被考虑到。 同时保持软件和硬件更新到最新版本可以预防这种错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙赤子

你的小小鼓励助我翻山越岭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值