Android NDK代码中的SIGILL

时间:2011-08-18 05:03:08

标签: android c++ assembly android-ndk arm

我在市场上推出了NDK应用程序,并获得了有关SIGILL信号的本机崩溃报告。 (我使用google breakpad生成本机崩溃报告。)以下是详细信息:

  • 我的应用已针对armeabi-v7a进行了编译,支持NEON。
  • 它在NVIDIA Tegra 2处理器上崩溃,这是ARM-7(Cortex-A9)。
  • 每次都会发生。 (联系用户)
  • 崩溃地址位于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 中的事实是否指向某处的损坏指针? (请注意,回溯非常有意义,因此不会因为事故而以某种方式调用此函数。)或者它是否还有其他内容?

2 个答案:

答案 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。 它帮助到我。 另一种解决方案是在可能的情况下移除霓虹灯支持