2012-04-02 4 views
6

OpenGL을 사용하여 Android에서 2D 게임을 만들고 있습니다. 현재 여러 장치에서 게임을 테스트하고 디버깅하고 있습니다. 내가 직면 한 문제는 끔찍한 "신호 11"오류입니다.신호 11 (SIGSEGV), 코드 1 (SEGV_MAPERR)

내 삼성 Galaxy Nexus에서 게임을 할 때 모든 것이 부드럽게 진행되며 게임을하지 않고도 몇 시간 동안 게임을 할 수 있습니다. 내 넥서스에서 Android ICS를 실행 중입니다.

이제 다른 장치에서 실행하면이 신호 11 오류가 발생합니다. HTC 디자 이어 HD (진저 브레드) - - HTC 디자 이어 Z (진저 브레드) - HTC 와일드 파이어 (진저 브레드) - 강림절 베가 태블릿 (Vegacomb) - 아수스 EE 패드 변압기 (아이스크림 샌드위치 : 이 오류를 던져 장치입니다)

내 Advent Vega에서 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. 

나는이 인터넷 검색, 가능한 수정을 위해 인터넷을 검색하지만, 거기에 정말 유용한 아무것도 .. 사람들은 SO (이 경우 libc.so에서) 파일을 찾아 선으로보고 얘기하지 않습니다 응용 프로그램이 충돌합니다.

지금 문제는 내가 Windows를 실행 중이며이 문제를 더 깊이 파고있는 방법을 모르는 것입니다. 방금 ​​여기 붙어 있습니다 ...

제 질문은 실제로 간단합니다. 아무도 나를 도와 줄 수 없나요? 이것을 조사 할 방법이 있습니까? "# 00 pc 0000d200 /system/lib/libc.so"의 의미를 알 수 있습니까?

+0

문제를 해결 했습니까? – vgonisanz

+0

디버그를 사용하여 건물을 사용해보십시오. 이를 통해 디버거는 종종 원시 메모리 주소를 기호로 매핑하고 코드에서 변경해야 할 위치를 가리킬 수 있습니다. http://stackoverflow.com/a/10539883/783051 –

답변

6

Zygote가 신호 11을 발생 시키면 금지 된 메모리 영역에 대한 일부 프로세스 액세스를 의미합니다. android_print를 사용하여 프로그램 액세스 및 실패 영역을 확인하고 DDMS를 사용하십시오.

OpenGL이 스레드 독립 객체에 대해 OpenGL 작업을 기억하고 있다면, 이런 종류의 문제를 피하기 위해 생성자에서 OpenGL이 사용하는 모든 변수를 inicializate하십시오. 테스트 렌더링 테스트를 시도한 다음 게임 코드를 사용하십시오.

+0

"android_print"는 무엇을 의미합니까? Log.d (또는 Log.v, 무엇이든)를 사용하여 물건을 인쇄하고 마지막으로 인쇄 된 것이 무엇인지 찾아야한다는 뜻입니까? 내 게임 코드에만 매달려 있으며 앱을 시작할 때마다 오류가 발생하지 않습니다. –

+0

예, Log.d를 말하고 싶습니다. 문제는 OpenGL을 사용하는 경우 다른 스레드 (독립형)에서 작동하므로, 예를 들어 OpenGL 스레드가 렌더링을 시도하기 전에 게임 스레드가 작업을 완료하면 시간이 걸릴 수 있습니다. 가능성 문제는 그 중 많은 부분입니다. – vgonisanz

1

libgles와 같은 호출 스택을 가진 SIGSEGV 11, 코드 1을 보았을 때 가장 먼저해야 할 일은 OpenGL/EGL 초기화를 확인하는 것입니다. 안드로이드에서 다른 GPU는 OpenGL 초기화 중에 요청하는 일부 기능을 지원할 수도 있고 지원하지 않을 수도 있습니다. 그들이 해달라고하지 않으면, 그것을 확인하고, 실패한 함수를 찾으십시오. 그리고 실패하면 구성 매개 변수를 사용하여 재 시도 할 코드를 추가하십시오.

0

비슷한 문제가있어서 "Build -> Refresh Linked C++ Library"를 클릭하기 만하면 해결됩니다.

아마도 다른 사람에게 유용 할 수 있습니다.