2011-08-18 55 views
8

我有一個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++)

你可以看到,0x399ccfconstd中間指令。根據arm.com該指令被添加到VFP-v3,應該(我認爲)在任何現代處理器中都可用。

可能會發生什麼?地址是否位於指令的中間這一事實指向某處的損壞指針? (請注意,回溯是非常有意義的,所以它不像這個函數在某種程度上被稱爲意外。)或者是其他的東西?

+0

FWIW,從NVIDIA方面在Tegra 2的VFPv3的支持官方,似乎答案可以在這裏找到(Spoiler:它的確如此,因此人們將此視爲問題,因爲VFPv3在Cortex-A9系列中標記爲「可選」)應該看起來更進一步。)http://developer.nvidia.com/tegra /論壇/做es-tegra-2-support-vfpv3 –

+0

對於Android上的Google Breakpad,有一個開放的問題,如果你想要一些簡單的點:) http://stackoverflow.com/questions/9752759/using-google-breakpad -for-android-ndk – olafure

回答

15

好吧,我明白了:NVIDIA Tegra 2只有16個64位GPU寄存器,因此要定位它,您必須使用-mfpu=vfpv3-d16進行編譯。有問題的指令使用了「太多」的寄存器d16。 :(

這裏是一個NVIDIA論壇的參考,其中僱員提到這一限制:http://developer.nvidia.com/tegra/forum/optimal-performance-guidelines

+0

就是這樣。它也不支持NEON指令。現在問題是......假設所有'armeabi-v7a'處理器都支持'vfpv3-d16'是否安全?是否有可能利用FPU,同時仍然指定「-mfloat-abi = softfp」(Android需要) – tmandry

+5

我之前實際上幾乎包含了Debian ARMEL項目網站的參考資料,但他們聲稱「 vfpv3-d16「是一個很好的」共同標準「。同樣的參考文獻中,softfp允許編譯器「根據選擇的FPU類型,做出關於何時以及是否生成模擬或真實FPU指令的明智選擇」,因此它看起來像是:您將能夠利用FPU該國旗。 http://wiki.debian.org/ArmHardFloatPort/VfpComparison –

+0

優秀的信息!非常感謝。 – tmandry

0

儘量把*。所以一個名爲「externallibs」文件夾中,並用它通過NDK建造建,後複製和粘貼*。所以在armeabi-V7A文件夾。 它幫助我。 的其他解決辦法是刪除NEON支持,如果有可能

相關問題