使用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:
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>.
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 --versionGNU gdbserver (GDB) 7.6Copyright (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)sharedset solib-search-path是设置so的搜索路径target remote 172.16.5.88:50391中172.16.5.88是PC-A的IP,50391是端口映射的端口。若PC-A与PC-B是同一台机器,则执行target remote :5039
0 0
- 使用GDB调试Android应用中C/C++代码
- 使用gdb在Android Emulator中进行调试c程序
- Android 系统中使用GDB调试C程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- Android emulator中C代码的调试——gdb/gdbservers时遇到的坑
- linux 下 android ndk-gdb 调试 jni 中的c 代码
- Android GDB 调试C/C++代码环境搭建
- GDB在线调试Android Framework Native C/C++代码
- 使用GDB调试C库
- 使用gdb调试C程序
- C编译: 使用gdb调试
- 使用GDB调试C库
- C编译: 使用gdb调试
- C编译: 使用gdb调试
- Linux 使用gdb对c/c++代码进行调试
- 【图像处理】NEON编程3 矩阵乘法
- java 集合框架
- XSS跨站脚本攻击过程的讲解
- 设计模式——六大原则
- ORA-12838
- 使用GDB调试Android应用中C/C++代码
- 第八周 项目三 顺序串算法(1)
- org.apache.catalina.core.StandardWrapperValve invoke
- USACO1.1 Greedy Gift Givers 比较分析
- 多线程
- hdu 5596 bestcode #66 1002
- HashMap源码分析(jdk1.8)
- wifi转串口芯片——ESP8266:配置与使用
- 遥感数据下载地址