Android gdb 调试
其实抛开android 应用环境,Gdb 本身就是个神迹。
Gdb作用:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。
Gdb原理图:
特别对于android native 层code,有时当我们难以理清程序动态执行时复杂函数调用、参数传递设置等等时,那么此时可以考虑gdb了。
如何使用Android gdb 调试:
Target : android 4.2.2 真机
Host : Ubuntu 64位
1.target 端:
1.1 进入adb 查看目标机器当前gdbserver版本号,如果没有安装则需要到源码ndk目录下找到相应gdbserver,push到/system/bin/目录下
1.1.2 ps 命令查看所要调试进程号,以mediaserver为例
1.3 目标端监听mediaserver进程
2.HOST端
2.1 找到相应的gdb调试程序
../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb
尝试运行./arm-linux-androideabi-gdb,但报错:
error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory
解决方法:sudo ln -s /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 /usr/lib/x86_64-linux-gnu/libpython2.6.so.1.0
2.2 运行gdb,注意gdb 版本
2.3 实现host对target远程监听,前tcp 1234代表local,后代表remote
到目前为止,看起来很顺利。。
2.4 加载调试二进制文件,一定要注意要与目标调试进程相对应。如调试进程mediaserver,我需要加载mediaserver,如果是app,则需要加载app_process.还要注意路径为symbols下。
2.5设置相应debug 包含symbols的库文件,同样注意路径为symbols下。
库文件绝对路径:
set solib-absolute-prefix /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/
库文件相对路径:
set solib-search-path /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/
此时如果ok的话,可以看到相应的动态链接库加载成功了。
Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/bin/linker...done.
Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/bin/linker
Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libc.so...done.
Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libc.so
Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libstdc++.so...done.
Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libstdc++.so
Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libm.so...done
....................................
3.可以开始调试之旅了,我在audioflinger 加断点,可以看到gdb的强大了,哈哈。
正如你所看到的,很顺利可以用gdb调试了,但过程真的如此么?其实略坎坷,实际中可能会遇到各种问题。例如:cannot access adrress 0x.... 或者info sharedlibrary 显示动态库未加载。可以尝试两个思路,一个是对应gdb版本是否匹配。如果你非常细心的话(当然,没看到也不代表不细心。。),2.2图中,我所运行并不是2.1路径下的gdb,版本不匹配可能会导致了一系列的问题。二就是host端file一定要加载对应的可执行文件。关于绝对路径和相对路径加载详细解释可参考:http://blog.csdn.net/_xiao/article/details/23289971 之前还谷歌了一文也不错,但没及时保存,怪我咯!
参考文章:
http://www.cnblogs.com/scue/p/4462523.html
http://blog.csdn.net/xinfuqizao/article/details/7955346
http://blog.chinaunix.net/uid-12567959-id-3214283.html
http://blog.chinaunix.net/uid-21254310-id-3447060.html
更多相关文章
- Android应用程序通用自动脱壳方法研究
- android 手机安装应用程序(APK)权限详细对照表
- Android加载drawable中图片后自动缩放的原理
- Android静默方式实现批量安装卸载应用程序
- Android下运行c程序
- .net程序员业余Android开发赚点外快(介绍一下自己的经验)
- Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
- Android编译系统中头文件搜索路径的顺序问题