我有一个NDK应用在市场上,并得到了一个关于SIGILL信号的本地崩溃报告。(我使用谷歌断板生成本机崩溃报告。)以下是详细信息:
armeabi-v7a,和霓虹灯支持编译的。0x399cc,信号是SIGILL,在我的代码中。登记和拆卸:
r4 = 0x001d50f0 r5 = 0x001d50f0 r6 = 0x598e2a3c r7 = 0x00000000
r8 = 0x00000001 r9 = 0x001c22b0 r10 = 0x00000000 fp = 0x81216264
sp = 0x598e2a18 lr = 0x816399cb pc = 0x816399cc
0x000399c6 <_ZN8Analyzer15setExpAvgFactorEi+22>: blx 0x30508
0x000399ca <_ZN8Analyzer15setExpAvgFactorEi+26>: fconstd d16, #7
0x000399ce <_ZN8Analyzer15setExpAvgFactorEi+30>: vldr d17, [pc, #32] ; 0x399f2 <_ZN8Analyzer15setExpAvgFactorEi+66>完整的源代码和汇编程序可用的这里 (它很短,基本上是2行C++)。
您可以看到,0x399cc位于fconstd指令的中间。根据arm.com的说法,这条指令是在VFP-v3中添加的,它应该(我认为)可以在任何现代处理器中使用。
会发生什么事?地址位于指令中间这一事实是否指向某个已损坏的指针?(请注意,反向跟踪非常有意义,因此它不像在意外事件中调用此函数一样。)或者是别的什么东西?
发布于 2011-08-18 08:00:36
好的,我明白了: NVIDIA 2只有16位64位的GPU寄存器,因此要瞄准它,你必须使用-mfpu=vfpv3-d16编译。所讨论的指令使用寄存器d16,它“太多了”。:(
以下是对NVIDIA论坛的引用,其中员工提到了这个限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines
发布于 2013-07-18 12:55:06
尝试将*.so放在一个名为“externallibs”的文件夹中,并在armeabi-v7a文件夹中复制和粘贴*.so之后,使用它构建ndk。这对我有帮助。另一个解决方案是,如果可能的话,移除霓虹灯的支持。
发布于 2022-09-27 14:05:48
(我知道答案,但这是我在搜索时得到的第一个结果。)
至少在ARM 32位设备上(我认为这是一种体系结构问题,不依赖于clang标志或NDK,但我很乐意加以纠正),如果您有一个返回某些内容的函数,比如int getSomeThing();和您的 not ,则在该函数的末尾有一个return语句,您可能会遇到错误的SIGILL。
所以这个:
int returnSomething() {
// do stuff
if(whatever) {
// more code
} // SIGILL at the end of the last block or instruction
// no return 0; here
}会触发它。
https://stackoverflow.com/questions/7102606
复制相似问题