是什么导致'SIGILL'信号?

Dab*_*ler 83 c++ android porting android-ndk

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

__CODE__

导致此错误:

__CODE__

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

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

Dab*_*ler 680

它现在有效.对于其他任何挣扎于Android/NDK/GCC/Eclipse的人来说,这就是我解决它的方法:

  1. 在满月的午夜埋葬一只死猫
  2. 重新启动Android设备模拟器

尚未验证两个步骤是否真的有必要,如果不是,哪个步骤是多余的.

  • 重新启动部分似乎无关紧要。 (63认同)

Max*_*int 31

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

虽然一些编译器会自动提供默认返回值,但其他编译器会在运行时尝试让函数没有返回值时发送 SIGILL 或 SIGTRAP。

  • 你不知道我花了多长时间寻找 SIGILL (QT + Android) 背后的原因,只是为了找到函数中缺少的 return 语句(受到你的回复的启发)。谢谢。 (10认同)

tro*_*foe 24

这意味着CPU试图执行它不理解的指令.这可能是由于我认为的腐败造成的,或者可能是因为错误的架构而被编译(在这种情况下我会认为O/S会拒绝运行可执行文件).不完全确定根本问题是什么.

  • 执行无效指令的另一个原因是跳转到不在程序区域中的地址. (21认同)

Bas*_*tch 21

它可能是一些未初始化的函数指针,特别是如果你有损坏的内存(那么C++的无效指针的错误指针可能会给出这个指针).

BTW gdb观察点和跟踪点以及valgrind可能对调试此类问题很有用(如果可用).或者一些地址清洁剂.


pka*_*amb 6

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

例如,具有越界索引的数组访问:

["foo", "bar"][2]
Run Code Online (Sandbox Code Playgroud)

LeetCode的编译器只显示错误:

运行时错误进程退出并发出信号SIGILL

在本地 Xcode Playground 中,相同的代码会导致错误

错误:执行被中断,原因:EXC_BREAKPOINT(代码=1,子代码=0x18f2ea5d8)。
进程已留在中断点,使用“thread return -x”返回到表达式求值之前的状态。

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

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