我正在使用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:致命错误:索引超出范围