【发布时间】:2023-03-25 22:03:02
【问题描述】:
我在市场上有一个 NDK 应用程序,并收到了关于 SIGILL 信号的本机崩溃报告。 (我使用 google breakpad 生成原生崩溃报告。)以下是详细信息:
- 我的应用是为
armeabi-v7a编译的,带有 NEON 支持。 - 它在 ARM-7 (Cortex-A9) 的 NVIDIA Tegra 2 处理器上崩溃。
- 它每次都会发生。 (联系了用户)
- 崩溃地址为
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 中添加的,(我认为)应该可以在任何现代处理器中使用。
会发生什么?地址位于指令的中间这一事实是否指向某处损坏的指针? (请注意,回溯非常有意义,所以这个函数并不是偶然被调用的。)或者是别的什么?
【问题讨论】:
-
FWIW,可以在此处找到来自 NVIDIA 关于 Tegra 2 上的 VFPv3 支持的官方回答。 (剧透:确实如此,因此人们将其视为问题,因为 VFPv3 在 Cortex-A9 系列上被标记为“可选”,应该进一步观察。)developer.nvidia.com/tegra/forum/does-tegra-2-support-vfpv3
-
至于 Android 上的 Google Breakpad,如果您想要一些简单的点,还有一个悬而未决的问题 :) stackoverflow.com/questions/9752759/…
标签: android c++ assembly android-ndk arm