我在市场上推出了NDK应用程序,并获得了有关SIGILL
信号的本机崩溃报告。 (我使用google breakpad生成本机崩溃报告。)以下是详细信息:
armeabi-v7a
,进行了编译,支持NEON。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>
完整的源代码和汇编程序here(简称,基本上是2行C ++。)
您可以看到0x399cc
位于fconstd
指令的中间。根据{{3}},VFP-v3
中添加了此指令,应该(我认为)可以在任何现代处理器中使用。
可能发生什么事?地址是否在指令的 middle 中的事实是否指向某处的损坏指针? (请注意,回溯非常有意义,因此不会因为事故而以某种方式调用此函数。)或者它是否还有其他内容?
答案 0 :(得分:16)
好的,我明白了:NVIDIA Tegra 2只有16个64位GPU寄存器,因此要定位它,你必须使用-mfpu=vfpv3-d16
进行编译。有问题的指令使用寄存器d16
,这是“太多”。 :(
以下是对NVIDIA论坛的引用,其中员工提及此限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines
答案 1 :(得分:0)
尝试将* .so放在名为'externallibs'的文件夹中,并在armeabi-v7a文件夹中复制并粘贴* .so后,使用它来构建ndk-build。 它帮助到我。 另一种解决方案是在可能的情况下移除霓虹灯支持