navtive 단에서 에러가 나면 증말 골치가 아프죠...
제가 격은 에러입니다.
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-18 16:33:21.830: I/DEBUG(20605): Build fingerprint: '~~~~~~~~~~/user/release-keys'
I/DEBUG(20605): pid: 20611, tid: 20611 >>> [packageName] <<<
I/DEBUG(20605): signal 4 (SIGILL), code 1 (ILL_ILLOPC), fault addr 818798e8
I/DEBUG(20605): r0 00000000 r1 8192004c r2 00000000 r3 00000160
I/DEBUG(20605): r4 001c7ea0 r5 001c82a0 r6 81914b48 r7 8192004c
I/DEBUG(20605): r8 00000000 r9 81913c38 10 00000001 fp 00000002
I/DEBUG(20605): ip 00000160 sp becaf070 lr aff10cb4 pc 818798e8 cpsr 60000010
I/DEBUG(20605): d0 bfc62e4300000000 d1 bebbb7eb81720340
I/DEBUG(20605): d2 3f1153165ec18a01 d3 4000000000000000
I/DEBUG(20605): d4 bf8d0c1646588a4b d5 3ff0000000000000
I/DEBUG(20605): d6 3ff0000000000000 d7 437ae89f5bd744fd
I/DEBUG(20605): d8 3ff0000000000000 d9 0000000000000000
I/DEBUG(20605): d10 0000000000000000 d11 0000000000000000
I/DEBUG(20605): d12 0000000000000000 d13 0000000000000000
I/DEBUG(20605): d14 0000000000000000 d15 0000000000000000
I/DEBUG(20605): scr 60000012
I/DEBUG(20605): #00 pc 000798e8 /data/data/[packageName]/lib/libbasicplayer.so
I/DEBUG(20605): #01 lr aff10cb4 /system/lib/libc.so
I/DEBUG(20605): libc base address: aff00000
I/DEBUG(20605): code around pc:
I/DEBUG(20605): 818798c8 e58de00c e58de010 e58da000 e58da004
I/DEBUG(20605): 818798d8 e58d8014 e58d8018 e58d801c eb001b72
I/DEBUG(20605): 818798e8 eddf0b3a e2850c15 e3a0100b e1a0200a
I/DEBUG(20605): 818798f8 e2800020 ee680b20 edcd0b00 eb01304b
I/DEBUG(20605): 81879908 eddf0b34 e2850d55 e1a0200a e3a01008
I/DEBUG(20605): code around lr:
I/DEBUG(20605): aff10c94 08bd87f0 e5964000 e5967000 e2144903
I/DEBUG(20605): aff10ca4 1a00000f f57ff05f e5965000 ebffed97
I/DEBUG(20605): aff10cb4 e2055a02 e3853001 e1500003 0a000006
I/DEBUG(20605): aff10cc4 e5865000 e1a00006 e1a01005 e3a02001
I/DEBUG(20605): aff10cd4 ebfffede e1a00004 e8bd87f0 e3a00000
I/DEBUG(20605): stack:
I/DEBUG(20605): becaf030 8192004c
I/DEBUG(20605): becaf034 0000031c
I/DEBUG(20605): becaf038 00000004
I/DEBUG(20605): becaf03c 81903104 /data/data/ [packageName] /lib/libbasicplayer.so
I/DEBUG(20605): becaf040 81902f20 /data/data/ [packageName] /lib/libbasicplayer.so
I/DEBUG(20605): becaf044 00000000
I/DEBUG(20605): becaf048 8192004c
I/DEBUG(20605): becaf04c 001c7ea0
I/DEBUG(20605): becaf050 001c82a0
I/DEBUG(20605): becaf054 81914b48
I/DEBUG(20605): becaf058 8192004c
I/DEBUG(20605): becaf05c 00000000
I/DEBUG(20605): becaf060 81913c38
I/DEBUG(20605): becaf064 00000001
I/DEBUG(20605): becaf068 df002777
I/DEBUG(20605): becaf06c e3a070ad
I/DEBUG(20605): #00 becaf070 00000001
I/DEBUG(20605): becaf074 00000001
I/DEBUG(20605): becaf078 81902f20 /data/data/ [packageName] r/lib/libbasicplayer.so
I/DEBUG(20605): becaf07c 00000004
I/DEBUG(20605): becaf080 00000004
I/DEBUG(20605): becaf084 00000000
I/DEBUG(20605): becaf088 00000000
I/DEBUG(20605): becaf08c 00000000
I/DEBUG(20605): becaf090 00000004
I/DEBUG(20605): becaf094 aff1446f /system/lib/libc.so
I/DEBUG(20605): becaf098 becaf0e4
I/DEBUG(20605): becaf09c 8190325c /data/data/ [packageName] /lib/libbasicplayer.so
I/DEBUG(20605): becaf0a0 8192c01c
I/DEBUG(20605): becaf0a4 8192a024
I/DEBUG(20605): becaf0a8 81903180 /data/data/ [packageName] /lib/libbasicplayer.so
I/DEBUG(20605): becaf0ac 81913c64
I/DEBUG(20605): becaf0b0 81915100
I/DEBUG(20605): becaf0b4 43660000
스택의 메모리 값을 추적하여 native 소스 코드의 어느 부분에서 에러가 나는지 출력해주는 addr2line을 이용하면 쉽게 에러 부분을 찾을 수가 있습니다. native 소스 코드가 컴파일 오류가 나지않고 실행오류가 날 때 이용하면 참 유용하죠!!!
(저는 ndk-r7 버전을 사용합니다.)
먼저 cygwin에서 다음과 같은 명령으로 add2line을 찾습니다.
/cydrive
$ find . -name *addr2line
~~ 어쩌고저쩌고
/cygdrive/c/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-addr2line.exe
에러를 가지고 있는 libName.so 파일로 이동합니다.
$ cd [ndk폴더]/[projectName ]/obj/local/armeabi-v7a
이동하였으면 다음과 같은 명령을 입력합니다.
/cygdrive/c/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-addr2line.exe -f -e libName.so address
위의 address 부분은 에로 로그에 빨간으로 표기된 16진수 숫자를 입력하면 됩니다.
#00 pc 000798e8 <- error가 일어난 부분입니다.
(addr2line은 환경변수 해서 하면 되는데 cygwin에서 환경변수 설정하는걸 몰라서 절대경로
로 addr2line 실행한 겁니다 ^^;)
저는 경로를 저도 모르게 틀리게 잡아서 여러번 삽질했습니다. 저같은 실수 안하시기를~
참고 문헌
http://stackoverflow.com/questions/5314036/how-to-use-addr2line-in-android
최근 덧글