我有一個NDK應用程序在市場上,並得到了關於SIGILL
信號的本機故障報告。 (我用谷歌breakpad生成本地崩潰報告。)下面是詳細信息:SIGILL在Android NDK代碼
- 我的應用程序被編譯爲
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的支持官方,似乎答案可以在這裏找到(Spoiler:它的確如此,因此人們將此視爲問題,因爲VFPv3在Cortex-A9系列中標記爲「可選」)應該看起來更進一步。)http://developer.nvidia.com/tegra /論壇/做es-tegra-2-support-vfpv3 –
對於Android上的Google Breakpad,有一個開放的問題,如果你想要一些簡單的點:) http://stackoverflow.com/questions/9752759/using-google-breakpad -for-android-ndk – olafure