2012-04-02 161 views
6

我正在使用OpenGL在Android上創建2D遊戲。 目前我正在幾臺設備上測試和調試遊戲。 我面臨的問題是可怕的「信號11」錯誤。信號11(SIGSEGV),代碼1(SEGV_MAPERR)

當我玩我的三星GALAXY Nexus,一切都運行流暢,而且我可以玩幾個小時沒有遊戲拋出任何錯誤。我的Nexus正在運行Android ICS。

現在,當我在其他設備上運行它時,我得到這個信號11錯誤。 這是它扔錯誤的設備: - 的HTC Desire HD(薑餅) - 的HTC Desire Z(薑餅) - HTC野火(薑餅) - 降臨維加片(Vegacomb) - 華碩EE Pad的變壓器(冰淇淋三明治)

我不能在我的降臨維加使用USB調試,但彈出錯誤的其他3個設備調試的。 看來我需要根據我的設備來獲取有關信號11錯誤的更多信息。 我能夠根據我的Galaxy Nexus和我的Desire HD。因爲錯誤似乎總是出現在同一時刻(當遊戲剛剛完成加載紋理時),我認爲我可以用一個根植設備來找出問題的原因,然後修復它,並在另一臺設備上測試新版本。

首先,我認爲它有一些東西需要與內存管理(不釋放我的對象,因此進行了很多GC的請求)。 因此,經過幾個小時的分析,優化,測試等,我發現這不是問題。 然後我認爲它與線程安全有關(一個線程試圖從內存中獲取某些內容,另一個線程剛剛銷燬該引用)。 但是,這似乎也不是這種情況。

好了,現在我有我的根Desire HD的有線到我的筆記本電腦,我有我的Eclipse項目開放,DDMS運行。

現在,當遊戲/應用程序崩潰時,logcat會告訴我什麼?

04-02 13:24:50.561: D/dalvikvm(3526): GC_CONCURRENT freed 739K, 43% free 4225K/7303K, external 1478K/1939K, paused 2ms+4ms 
04-02 13:24:50.661: D/dalvikvm(3526): GC_FOR_MALLOC freed 99K, 43% free 4261K/7431K, external 1466K/1939K, paused 29ms 
04-02 13:24:50.701: I/DEBUG(3412): debuggerd: 2012-04-02 13:24:50 
04-02 13:24:50.701: I/DEBUG(3412): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
04-02 13:24:50.701: I/DEBUG(3412): Build fingerprint: 'vodafone_uk/htc_ace/ace:2.3.5/GRJ90/208029.3:user/release-keys' 
04-02 13:24:50.701: I/DEBUG(3412): pid: 3526, tid: 3539 >>> com.more2create.cityisland <<< 
04-02 13:24:50.701: I/DEBUG(3412): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0088d410 
04-02 13:24:50.701: I/DEBUG(3412): r0 4b89de00 r1 0088d410 r2 00000000 r3 00000000 
04-02 13:24:50.701: I/DEBUG(3412): r4 00000000 r5 00000000 r6 00000020 r7 00000001 
04-02 13:24:50.701: I/DEBUG(3412): r8 45a98b68 r9 458dbde0 10 0034f598 fp 440b0000 
04-02 13:24:50.701: I/DEBUG(3412): ip 806091c8 sp 45a989d0 lr 80602a0c pc afd0d200 cpsr 60000010 
04-02 13:24:50.701: I/DEBUG(3412): d0 42a0000000000000 d1 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d2 0000000042200000 d3 4220000042a00000 
04-02 13:24:50.701: I/DEBUG(3412): d4 000000003df5c2a0 d5 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d6 0000000000000101 d7 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d8 3f8000003f800000 d9 8000000080000000 
04-02 13:24:50.701: I/DEBUG(3412): d10 8000000080000000 d11 3ff0000080000000 
04-02 13:24:50.701: I/DEBUG(3412): d12 3f8000003f800000 d13 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d14 0000000000000000 d15 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d16 000172c000000000 d17 7e37e43c8800759c 
04-02 13:24:50.701: I/DEBUG(3412): d18 3fff8def8808b024 d19 465aa3f469f40e1c 
04-02 13:24:50.701: I/DEBUG(3412): d20 4008000000000000 d21 3fd99a27ad32ddf5 
04-02 13:24:50.701: I/DEBUG(3412): d22 3fd24998d6307188 d23 3fcc7288e957b53b 
04-02 13:24:50.701: I/DEBUG(3412): d24 3fc74721cad6b0ed d25 3fc39a09d078c69f 
04-02 13:24:50.701: I/DEBUG(3412): d26 0000000000000000 d27 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d28 0000000000000000 d29 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): d30 0000000000000000 d31 0000000000000000 
04-02 13:24:50.701: I/DEBUG(3412): scr 60000012 
04-02 13:24:50.741: I/DEBUG(3412):   #00 pc 0000d200 /system/lib/libc.so 
04-02 13:24:50.741: I/DEBUG(3412):   #01 pc 00002a08 /system/lib/libgsl.so 
04-02 13:24:50.741: I/DEBUG(3412):   #02 pc 00089e24 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #03 pc 00091f14 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #04 pc 0006087a /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #05 pc 00060942 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #06 pc/system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #07 pc 000835e0 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #08 pc 00014504 /system/lib/egl/libGLESv1_CM_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #09 pc 0001d3c0 /system/lib/egl/libGLESv1_CM_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):   #10 pc 0002be40 /system/lib/libandroid_runtime.so 
04-02 13:24:50.741: I/DEBUG(3412):   #11 pc 00018174 /system/lib/libdvm.so 
04-02 13:24:50.741: I/DEBUG(3412): code around pc: 
04-02 13:24:50.741: I/DEBUG(3412): afd0d1e0 f5d1f100 e2522040 f400022d f400422d 
04-02 13:24:50.741: I/DEBUG(3412): afd0d1f0 2afffff8 e2822040 e2522020 3a000003 
04-02 13:24:50.741: I/DEBUG(3412): afd0d200 f421020d e2522020 f400022d 2afffffb 
04-02 13:24:50.741: I/DEBUG(3412): afd0d210 e2822020 e3120010 0a000001 f4210a0d 
04-02 13:24:50.741: I/DEBUG(3412): afd0d220 f4000a2d e1b0ce82 3a000001 f421070d 
04-02 13:24:50.741: I/DEBUG(3412): code around lr: 
04-02 13:24:50.741: I/DEBUG(3412): 806029ec e5901008 e0836005 e1560001 8a000006 
04-02 13:24:50.741: I/DEBUG(3412): 806029fc e5903000 e1a0100c e0830005 eb00099c 
04-02 13:24:50.741: I/DEBUG(3412): 80602a0c e1a00004 e28dd008 e8bd8070 e59f004c 
04-02 13:24:50.741: I/DEBUG(3412): 80602a1c e1a02005 e59fc048 e58d1000 e79e0000 
04-02 13:24:50.741: I/DEBUG(3412): 80602a2c e08e100c e28000a8 ebfffef8 e3e00000 
04-02 13:24:50.741: I/DEBUG(3412): stack: 
04-02 13:24:50.741: I/DEBUG(3412):  45a98990 0000000a 
04-02 13:24:50.741: I/DEBUG(3412):  45a98994 00000080 
04-02 13:24:50.741: I/DEBUG(3412):  45a98998 00494e80 
04-02 13:24:50.741: I/DEBUG(3412):  45a9899c 80886cd9 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):  45a989a0 00494e80 
04-02 13:24:50.741: I/DEBUG(3412):  45a989a4 00000008 
04-02 13:24:50.741: I/DEBUG(3412):  45a989a8 46b2a078 
04-02 13:24:50.741: I/DEBUG(3412):  45a989ac 80898f25 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.741: I/DEBUG(3412):  45a989b0 00368360 
04-02 13:24:50.741: I/DEBUG(3412):  45a989b4 00000008 
04-02 13:24:50.741: I/DEBUG(3412):  45a989b8 00000080 
04-02 13:24:50.741: I/DEBUG(3412):  45a989bc 80899041 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:50.751: I/DEBUG(3412):  45a989c0 00000008 
04-02 13:24:50.751: I/DEBUG(3412):  45a989c4 00000000 
04-02 13:24:50.751: I/DEBUG(3412):  45a989c8 df002777 
04-02 13:24:50.751: I/DEBUG(3412):  45a989cc e3a070ad 
04-02 13:24:50.751: I/DEBUG(3412): #00 45a989d0 4b89de00 
04-02 13:24:50.751: I/DEBUG(3412):  45a989d4 80602a0c /system/lib/libgsl.so 
04-02 13:24:50.751: I/DEBUG(3412): #01 45a989d8 00368360 
04-02 13:24:50.751: I/DEBUG(3412):  45a989dc 00000020 
04-02 13:24:50.751: I/DEBUG(3412):  45a989e0 004aa8e0 
04-02 13:24:50.751: I/DEBUG(3412):  45a989e4 00371648 
04-02 13:24:50.751: I/DEBUG(3412):  45a989e8 004aa8fc 
04-02 13:24:50.751: I/DEBUG(3412):  45a989ec 80889e27 /system/lib/egl/libGLESv2_adreno200.so 
04-02 13:24:51.132: I/BootReceiver(1361): Copying /data/tombstones/tombstone_08 to DropBox (SYSTEM_TOMBSTONE) 
04-02 13:24:51.142: I/DEBUG(3412): debuggerd committing suicide to free the zombie! 
04-02 13:24:51.182: I/DEBUG(3544): debuggerd: Nov 22 2011 21:11:52 
04-02 13:24:51.222: D/dalvikvm(1361): GC_FOR_MALLOC freed 551K, 36% free 8894K/13703K, external 1258K/1770K, paused 78ms 
04-02 13:24:51.222: V/DeviceStorageMonitorService(1361): freeMemory=1053483008 
04-02 13:24:51.232: D/DeviceStorageMonitorService(1361): OoO SMS Memory available. SMS_AVAILABLE_THRESHOLD == 524288 
04-02 13:24:51.232: I/DeviceStorageMonitorService(1361): Posting Message again 
04-02 13:24:51.292: I/ActivityManager(1361): Process com.more2create.cityisland (pid 3526) has died. 

當然我GOOGLE了這一點,並尋找可能的解決互聯網,但沒有真正有實用.. 人們都在談論尋找到的SO文件(在這種情況下libc.so),並找到行應用程序崩潰。

現在,問題是我正在運行Windows,並且不知道如何深入挖掘此問題。 我只是堅持在這裏......

所以,我的問題其實很簡單:任何人都可以幫助我在這裏? 有什麼方法可以挖掘到這一點? 我能找出「#00 pc 0000d200 /system/lib/libc.so」的含義嗎?

+0

你解決了這個問題嗎? – vgonisanz 2012-06-13 07:52:30

+0

嘗試使用啓用調試的構建;這通常會讓調試器將原始內存地址映射到符號,並可指向您可能需要對代碼進行更改的位置。請參閱http://stackoverflow.com/a/10539883/783051 – 2013-08-20 21:18:11

回答

6

當Zygote拋出一個信號11時,這意味着某些進程訪問禁止的內存區域。我建議使用android_print檢查程序訪問和失敗的區域,使用DDMS。

如果您正在使用的OpenGL記得上線independient OpenGL的工作,所以,inicializate使用OpenGL的構造上,以避免這類問題的所有變量。嘗試測試渲染測試,然後使用您的遊戲代碼。

+0

「android_print」是什麼意思?你的意思是我應該使用Log.d(或Log.v,無論)來打印內容並找出上次打印的內容?它只會掛在我的遊戲代碼上,並且每次啓動應用程序時都不會拋出錯誤。 – 2012-04-02 11:55:13

+0

是的,我想說Log.d.問題是,如果你使用的是OpenGL,它可以在另一個線程(獨立的)中工作,所以如果遊戲線程在opengl線程嘗試渲染之前完成工作,那麼一段時間就可以工作。可能的問題很多。 – vgonisanz 2012-04-02 12:32:36

1

如果你看到SIGSEGV 11,代碼1與調用堆棧像libgles,你應該做的第一件事就是檢查OpenGL/EGL初始化。 Android上的不同GPU可能會或可能不會支持您在OpenGL初始化期間請求的某些功能。如果他們沒有,你必須檢查它,找到一個失敗的功能, ,當它失敗時添加一個代碼,將重試與工作配置參數。

0

我有一個類似的問題,我解決了,只需點擊「構建 - >刷新鏈接C++庫」。

也許可以對別人有用。

相關問題