是什么导致'SIGILL'信号?

时间:2011-10-26 11:17:38

标签: c++ android-ndk porting

我正在使用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

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

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

4 个答案:

答案 0 :(得分:666)

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

  1. 在满月的午夜埋葬死猫
  2. 重新启动Android设备模拟器
  3. 尚未验证两个步骤是否真的有必要,如果不是,哪一步是多余的。

答案 1 :(得分:22)

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

答案 2 :(得分:21)

它可能是一些未初始化的函数指针,特别是如果你的内存已损坏(那么C ++的无效指针错误指针的虚假表格可能就是这样)。

BTW gdb观察点&amp;跟踪点以及valgrind可能对调试此类问题很有用(如果可用)。或者一些address sanitizer

答案 3 :(得分:0)

如果您要将代码从gcc迁移到clang并开始在某个函数的最后一个语句中获取SIGILL或SIGTRAP,那么请确保该函数具有return语句(如果已使用非无效返回类型声明了该语句)