其实抛开android 应用环境,Gdb 本身就是个神迹。

Gdb作用:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

Gdb原理图:

Android gdb 调试_第1张图片

Android gdb  调试作用:

特别对于android native code,有时当我们难以理清程序动态执行时复杂函数调用、参数传递设置等等时,那么此时可以考虑gdb了。

 

如何使用Android gdb 调试

Target : android 4.2.2 真机

Host : Ubuntu 64

1.target 端:

1.1 进入adb 查看目标机器当前gdbserver版本号,如果没有安装则需要到源码ndk目录下找到相应gdbserverpush/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 版本

Android gdb 调试_第2张图片

2.3 实现hosttarget远程监听,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的强大了,哈哈。

   Android gdb 调试_第3张图片

正如你所看到的,很顺利可以用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

更多相关文章

  1. Android应用程序通用自动脱壳方法研究
  2. android 手机安装应用程序(APK)权限详细对照表
  3. Android加载drawable中图片后自动缩放的原理
  4. Android静默方式实现批量安装卸载应用程序
  5. Android下运行c程序
  6. .net程序员业余Android开发赚点外快(介绍一下自己的经验)
  7. Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析
  8. Android编译系统中头文件搜索路径的顺序问题

随机推荐

  1. android 热修复之类加载机制
  2. 解读Android LOG机制的实现:c/c++域使用LO
  3. Android音频口数据通信开发;通过静态分析
  4. android json访问php webservice
  5. Android中AsyncTask的简单用法 .
  6. android app 缓存 ---- android 文件缓存
  7. 如何在Android上显示wmf的文件
  8. Android(安卓)中Message,MessageQueue,Lo
  9. 【Android增量升级系列_02】 浅谈Android
  10. Android之Weight属性源码解析