什么原因导致信号"SIGILL"?



我正在使用NDK和GCC将一些c++代码移植到Android。代码基本上可以运行。在Eclipse中调试时,有一次调用

Dabbler::Android::Factory* pFactory = new Dabbler::Android::Factory;

导致这个错误:

Thread [1] (Suspended: Signal 'SIGILL' received. Description: Illegal instruction.) 
    1 <symbol is not available> 0x812feb44

那是什么意思?编译器是否出于某种原因生成了非法代码?我在构造函数中有一个断点(它什么都不做),它没有被击中。我已经完成了一个完整的重建。

我做错了什么导致这个问题?

确保所有非void返回类型的函数都有一个return语句。

当一些编译器自动提供默认返回值时,其他编译器会在运行时发送SIGILL或SIGTRAP,当试图离开没有返回值的函数时。

表示CPU试图执行它不理解的指令。我猜这可能是由于损坏造成的,或者可能是为错误的体系结构编译的(在这种情况下,我认为O/S会拒绝运行可执行文件)。不完全确定问题的根源是什么

它可能是一些未初始化的函数指针,特别是如果您有损坏的内存(然后c++指向无效对象的坏指针的伪造虚函数表可能会给出此值)。

BTW gdb观察点&tracepoint和valgrind对于调试此类问题可能很有用(如果可用)。或者一些地址消毒液

LeetCode的在线编译器和开发环境会生成SIGILL错误,这些错误在我的桌面IDE中不会产生相同的错误。

例如,使用越界索引访问数组:

["foo", "bar"][2]

LeetCode的编译器只显示错误:

运行时错误进程以信号SIGILL

退出

在一个本地Xcode游乐场,相同的代码导致错误:

error: Execution was interrupted, reason: EXC_BREAKPOINT (code=1, subcode=0x18f2ea5d8)。
进程已被留在它被中断的位置,使用"thread return -x"返回到表达式求值前的状态。

只有在完整的Xcode项目编译和运行时,它才会报告实际的错误:

线程1:致命错误:索引超出范围

最新更新