Android gdb 调试

来源:互联网 发布:新店能开淘宝直播吗 编辑:程序博客网 时间:2024/06/07 14:57

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

Gdb作用:

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

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

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

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

Gdb原理图:


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 版本


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的强大了,哈哈。

   

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

0 0
原创粉丝点击