关于android 上 gdb调试进程的方法请参考前一篇文章。
如果 android应用程序 包含动态库调用,程序异常退出后 给出一堆地址,
如
I/DEBUG ( 841): signal 11 (SIGSEGV), fault addr deadbaad
I/DEBUG ( 841): r0 00000000 r1 afd1498d r2 00000027 r3 00000070
I/DEBUG ( 841): r4 afd42328 r5 00000000 r6 00000000 r7 4e6fae30
I/DEBUG ( 841): r8 00100000 r9 a811c2f9 10 4e5fb000 fp 0013cdb8
I/DEBUG ( 841): ip 0000173c sp 4e6fa9d8 lr deadbaad pc afd11f40 cpsr 60000030
I/DEBUG ( 841): d0 400000003eaaaaab d1 3ff0000041f00000
I/DEBUG ( 841): d2 0000000050baf6de d3 0000000000000000
I/DEBUG ( 841): d4 00000007000000b4 d5 3fe999999999999a
I/DEBUG ( 841): d6 3fe000000000000binder: release proc 1047, transaction 109259, not freed
0 d7 3eaaaaab3f800000
I/DEBUG ( 841): d8 0000000000000000 d9 0000000000000000
I/DEBUG ( 841): d10 0000000000000000 d11 0000000000000000
I/DEBUG ( 841): d12 0000000000000000 d13 0000000000000000
I/DEBUG ( 841): d14 0000000000000000 d15 0000000000000000
I/DEBUG ( 841): scr 80000012
根据 pc 地址 及crash的 动态库可以推断出现问题的 代码位置,
利用 gcc 的 命令arm-eabi-addr2line ,从地址到代码位置的定位:
具体例子:比如我的 动态库为 hello.so,把此库放在本地 带 symbols 的android lib目录下,执行
arm-eabi-addr2line -C-f -e /path/to/lib/with_sysbols/hello.so afd11f40
上面的afd11f40 为 crash时的pc 地址:
(I/DEBUG ( 841): ip 0000173c sp 4e6fa9d8 lr deadbaad pc afd11f40 cpsr 60000030
注意点:
1. 最好把你的动态苦编译成调试版本(-g)
2. 要把你的动态苦放在android 动态库的 sysbols版本目录下,比如我的机器上目录为:(Eg.)/home/usera/android/out/target/product/generic/symbols/system/lib