2010/04/20

NDK: Assert 걸렸을 때 PC 값의 주소 보는 방법

출처: http://groups.google.com/group/android-developers/browse_thread/thread/73f89bb8739c24bb/5228e7a5dcfff090

Assert가 걸렸을 때 Symbol들(eg. Function name)이 보이지 않는 이유는 Device에 Install 될 때, Library의 Symbol들을 떼어 버리기 때문이다.

Symbol들을 보기 위해서는 addr2line을 쓰는 방법과 gdb/gdbserver를 쓰는 방법이 있는데, 비교적 사용법이 간단한 addr2line을 사용하는 방법을 알아본다.

사용법은 아래와 같다.

cygwin의 Bash를 띄운 후 아래와 같이 입력하면 된다.
arm-eabi-addr2line.exe -f -e <library name> <address>

-f: Show function names
-e: Set the input file names

만약 아래와 같이 Assert가 발생했다고 하자.

Build fingerprint: XXXX
pid: 1917, tid: 1960  >>> XXXX <<<
signal 11 (SIGSEGV), fault addr 450774f0
 r0 ffffffa5  r1 ffec01a4  r2 450774f0  r3 45235310
 r4 fffffb00  r5 ff000000  r6 ff000000  r7 000001df
 r8 00ff00ff  r9 4767fca4  10 4767fcc0  fp 00000780
 ip 000000ff  sp 4767fac0  lr 80d1c041  pc 80d1c176  cpsr a0000030
         #00  pc
0001c176  YYYY.so         #01  pc 0003b026  YYYY.so         #02  pc 00005aba  YYYY.so         #03  pc 0000312a  YYYY.so         #04  pc 0000f1f4  /system/lib/libdvm.so


위에서 PC 값에 적힌, 주소를 Library와 함께 넣어주면 된다.
arm-eabi-addr2line.exe -f -e YYYY.so 0001c176
출력>
[Symbol Name]
??:0

arm-eabi-addr2line.exe -f -e YYYY.so 0003b026
출력>
[Symbol Name]
??:0

주) arm-eabi-addr2line.exe는 NDK의 build\prebuilt\windows\arm-eabi-4.4.0\bin\에 존재한다.

댓글 1개:

MJ. :

잘 보고 갑니다 :-) mj.lee