- 所有调试借用的是 ndk里面自带的功能,gdbserver 和 gdb
- 首先我们的编译链里面会有个 程序叫 gdbserver
使用gdbserver可以对目标设备上的程序进行远程调试
所以我们需要将这个程序推到 手机里面
- 我运行的手机的目录是 /data/local/tmp
使用adb将此程序推到手机中, adb push gdbserver /data/local/tmp/
顺便赋权限 adb shell "chmod 777 /data/local/tmp/gdbserver "
- 编译Makefile中,Application.mk 中增加 APP_OPTIM := debug 将编译的程序设置成debug的,编译选项记得加-g, 不然没法调试
- 将编译好的可执行程序拷贝到手机中去,我的可执行程序名称为embeed
adb push embeed /data/local/tmp/
adb shell "chmod 777 /data/local/tmp/embeed"
- 创建两个窗口,第一个窗口,
输入命令:adb shell 进入手机
输入命令:cd /data/local/tmp 进入运行目录
启动 gdbserver, 并设定一个端口号,来和调试窗口绑定,并等待客户端连接,输入命令:./gdbserver :1238 embeed
- 运行命令:adb forward tcp:1238 tcp:1238 此时开始等待中
(ps: 这个端口号,你可以自己来任意设定,这个设置好像存在点bug,无法强制中断,最好的方法就是关闭这个窗口,带来的问题就是,你需要换个端口号)
- 第二个窗口,调试窗口,不需要进入手机(ps: 可调试设备需要与手机连接)
进入到你编译的上层目录,也就是jni的上层目录,因为在那个目录下,会有obj文件夹等一些可调式信息在里面
连接你电脑上的gdb, 此gdb一般位于ndk-r15c/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gdb.exe (此处记住需要选正确)
运行命令:./gdb.exe (进入调试状态)
- 加载带调试信息的可执行文件
(gdb)set solib-search-path obj/local/armeabi-v7a
(gdb)file obj/local/armeabi-v7a/embeed (加载带符号的可执行文件)
(gdb)target remote 1238 (连接端口开始调试了)
- 此时可以调试运行了,恭喜可以调试了
参考文档:使用gdbserver远程调试 - 简书
C层代码-远程调试android手机-gdbserver
于 2022-06-20 10:13:00 首次发布
本文详细介绍了如何使用gdbserver进行远程调试Android手机上的C层代码。首先,通过adb将gdbserver推送到手机并赋予执行权限。接着,在Makefile中设置APP_OPTIM为debug,确保编译选项包含-g。然后,将编译好的可执行程序复制到手机,启动gdbserver并指定端口号,通过adb forward建立连接。在两个不同的终端窗口中,一个运行gdbserver等待调试,另一个使用gdb连接并加载可执行文件开始调试。通过这种方法,可以成功地对Android设备上的C程序进行远程调试。

2243

被折叠的 条评论
为什么被折叠?



