我正在使用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
这是什么意思?编译器是否因某种原因生成了非法代码?我在构造函数中有一个断点(它什么都不做),而且它没有被击中。我已经完成了重建。
导致这个问题我能做错什么?
答案 0 :(得分:666)
现在有效。对于其他任何在Android / NDK / GCC / Eclipse上苦苦挣扎的人来说,这就是我解决它的方法:
尚未验证两个步骤是否真的有必要,如果不是,哪一步是多余的。
答案 1 :(得分:22)
这意味着CPU试图执行它不理解的指令。这可能是由于我猜想的腐败造成的,或者可能是因为错误的架构而被编译(在这种情况下我会认为O / S会拒绝运行可执行文件)。不完全确定根本问题是什么。
答案 2 :(得分:21)
它可能是一些未初始化的函数指针,特别是如果你的内存已损坏(那么C ++的无效指针错误指针的虚假表格可能就是这样)。
BTW gdb
观察点&amp;跟踪点以及valgrind可能对调试此类问题很有用(如果可用)。或者一些address sanitizer。
答案 3 :(得分:0)
如果您要将代码从gcc迁移到clang并开始在某个函数的最后一个语句中获取SIGILL或SIGTRAP,那么请确保该函数具有return
语句(如果已使用非无效返回类型声明了该语句)