什么导致信号“ SIGILL”?


90

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

那是什么意思?编译器是否由于某种原因生成了非法代码?我在构造函数中有一个断点(不执行任何操作),并且没有命中。我已经完成了完整的重建。

我会做错什么导致此问题?

Answers:


27

这意味着CPU试图执行它不理解的指令。我猜这可能是由损坏引起的,或者它是为错误的体系结构编译的(在这种情况下,我本以为操作系统会拒绝运行可执行文件)。不能完全确定根本问题是什么。


24
执行无效指令的另一个原因是跳转到程序区域之外的地址。
保罗·内森

很奇怪,当我使用clang编译时,我明白了这一点,但是在gcc上工作得很好
发布

22

它可能是一些未初始化的函数指针,尤其是在内存损坏的情况下(然后,C ++虚假的指向无效对象的错误指针可能会给出错误的表)。

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


对我来说,我没有从应该返回int的函数中返回任何值。所以有点与此答案有关。不知道它如何设法编译。
克里斯·瓦茨

11

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

尽管某些编译器会自动提供默认的返回值,但其他编译器将在运行时尝试将函数保留为没有返回值时发送SIGILL或SIGTRAP。


您不知道为寻找SIGILL(QT + Android)背后的原因而花了多长时间才发现函数中缺少的return语句(受您的答复启发)。谢谢。
Vega4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.