使用GDB调试Android应用中C/C++代码

来源:互联网 发布:C语言间接访问 编辑:程序博客网 时间:2024/05/18 13:31
使用GDB调试Android应用中C/C++代码

一、准备工作
  • 1)准备一台PC(称为PC-A),用于连接手机。
这台机器可以是windows,也可以是ubuntu。这台机器用于连手机,需要安装Android SDK

  • 2)编译debug版本
Android应用中使用的C/C++代码最终编译成so文件,使用GDB调试时需要debug版本的so,即带符号表的so文件。
Android系统中的带符号表的so文件编译在symbols目录下(例如:/your/android/folder/out/target/product/generic/symbols),在这个目录你可以找到你要调试的so文件。

  • 3)准备一台PC称为PC-B),用于操作GDB
一般我选用在编译机器上进行GDB操作。这台机器可与PC-A是同一台机器,也可以是不同机器。
找一个gdb程序,名字是arm-linux-androideabi-gdb
如果你有整个Android平台代码,位置在your/android/folder/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-x.x/bin
或下载一个NDK,在目录ndk/toolchains/arm-linux-androideabi-x.x/prebuilt/linux-x86_64/bin/中也可找到。
查看一下版本信息,这个版本要与手机上的gdbserver版本一致
$ ./arm-linux-androideabi-gdb --version 
Python Exception <type 'exceptions.ImportError'> No module named gdb: 

warning: 
Could not load the Python gdb module from `/tmp/toolchain-build-linux-7.6/prefix/share/gdb/python'. 
Limited Python support is available from the _gdb module. 
Suggest passing --data-directory=/path/to/gdb/data-directory. 

GNU gdb (GDB) 7.6 
Copyright (C) 2013 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android". 
For bug reporting instructions, please see: 
<http://source.android.com/source/report-bugs.html>. 


  • 4)准备一台手机
gdb使用时需要在手机侧运行gdbserver,在PC侧运行gdb,这两个版本需要一致。
检查手机上GDB版本的方法是
$ adb shell 
# gdbserver --version 
GNU gdbserver (GDB) 7.6 
Copyright (C) 2013 Free Software Foundation, Inc. 
gdbserver is free software, covered by the GNU General Public License. 
This gdbserver was configured as "arm-eabi-linux" 
gdbserver是存在/system/bin目录下,若没有需要拷贝一个。

  • 说明
对于输入命令的说明:
$cmd     表明该命令运行于PC-A控制台上
#cmd     表明该命令运行于android设备控制台上,即adb shell后界面
(gdb)cmd 表明该命令运行于GDB控制台上,即进入GDB后的界面
黑色字表示输出信息

三、调试过程
  • 1)运行应用
手机连上PC-A,在手机上运行应用,例如运行浏览器应用

  • 2)手机上建立gdbserver
PC-A上开一个命令窗口(称为窗口1),输入如下
$ adb shell 
# ps | grep browser 
u0_a113 2897 251 717184 96964 ffffffff 400528c8 S com.android.browser 
# gdbserver :5039 --attach 2897 
Attached; pid = 2897 
Listening on port 5039 

# ps | grep browser 是用于查看浏览器的pid
# gdbserver :5039 --attach 2897  这一步是用于建立gdb server,其中5039是端口号,只要不与其他程序冲突,可以任意定义。2897是browser的pid,在上一条命令输出中可以查到


  • 3)数据转发
再在PC-A上开一个窗口(称为窗口2),执行
$adb forward tcp:5039 tcp:5039
这个命令就是将PC-A 5039端口数据转发到手机5039端口。在PC-A上通过127.0.0.1:5039就可连上gdbserver。

  • 4)端口映射
若PC-A与PC-B是同一台机器,忽略这一步。
若PC-A与PC-B不是同一台机器,需要在PC-A上再进行端口映射。将访问PC-A的数据映射到127.0.0.1:5039上
如在windows平台上使用portmap


  • 5)启动GDB Client
在PC-B上开一个命令窗口,这个窗口是用于操作gdb client
进入arm-linux-androideabi-gdb所在的目录,执行如下命令
$./arm-linux-androideabi-gdb ~/browser/android4.4-chromium/android4.4/out/target/product/generic/symbols/system/bin/app_process 
(gdb)set solib-absolute-prefix /home/browser/android4.4-chromium/android4.4/out/target/product/generic/symbols
(gdb)set solib-search-path /home/browser/android4.4-chromium/android4.4/out/target/product/generic/symbols/system/lib
(gdb)target remote 172.16.5.88:50391
(gdb)shared
set solib-search-path是设置so的搜索路径
target remote 172.16.5.88:50391172.16.5.88是PC-A的IP,50391是端口映射的端口。若PC-A与PC-B是同一台机器,则执行target remote :5039
0 0
原创粉丝点击