android 上调试动态库方法


关于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




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/perfectpdl/article/details/6873932
个人分类: android Framework
上一篇一个 android 资料
下一篇整理的 英文 c/c++ 编程 wiki
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭