我有一个 NDK 应用程序上市,并获得了关于 SIGILL
信号的 native 崩溃报告。 (我使用 google breakpad 生成 native 崩溃报告。)以下是详细信息:
- 我的应用是为
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
指令的中间。根据arm.com此指令已添加到 VFP-v3
中,(我认为)它应该适用于任何现代处理器。
可能发生了什么?地址位于指令的中间这一事实是否指向某处损坏的指针? (请注意,回溯非常有意义,所以这个函数并不是偶然被调用的。)还是其他原因?
最佳答案
好的,我明白了:NVIDIA Tegra 2 只有 16 个 64 位 GPU 寄存器,因此要定位它,您必须使用 -mfpu=vfpv3-d16
进行编译。有问题的指令使用寄存器 d16
,这“太多了”。 :(
这是对 NVIDIA 论坛的引用,其中一名员工提到了此限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines
关于android - Android NDK 代码中的 SIGILL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102606/