1. gdbserver 位置:$NDK_DIR/prebuilt/android-arm/gdbserver
2. gdb 位置:$NDK_DIR/toolchains/arm-Linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gdb.exe
中间的路径根据自己情况更改
需要注意的是gdbserver和gdb的版本要匹配,否则会出错
待调试的程序为$PRJ_DIR/test_prj
1.在目标机上创建目录/data/test
adb push $NDK_DIR/prebuilt/android-arm/gdbserver /data/test/
adb push $PRJ_DIR/test_prj /data/test/
2.在目标机赋予执行权限
chmod +x ./test_prj
chmod +x gdbserver
3.在目标机上启动gdbserver
./gdbserver :1234 test_prj [param]
注意gdbserver后面有空格,冒号与1234之间没有空格
如果test_prj需要参数,后面可以加上参数
执行成功则显示
Process test_prj created: pid = 16225
Listening on port 1234
4.在宿主机(windows)上执行arm-linux-androideabi-gdb.exe
执行成功则显示gdb版本号、版权信息等,并有gdb命令提示符
5.在gdb命令提示符后输入命令
(gdb)shell adb forward tcp:1234 tcp:1234
该命令表示通过adb映射tcp端口1234,命令中前面的是local的端口,后面的是remote的端口
可能会显示
adb server is out of date. killing...
* daemon started successfully *
(gdb) target remote localhost:1234
该命令表示与远程程序建立链接
执行成功则显示
- Remote debugging using localhost:1234
- Cannot access memory at address 0x0
- 0x40011384 in ?? ()
Remote debugging form host 127.0.0.1
至此,说明gdb与gdbserver连接成功,可以进行调试了
6.调试
(gdb)file $PRJ_DIR/test_prj
该命令用于读取调试符号
显示
Are you sure you want to change the file?(y or n)
输入y
(gdb) b main
该命令用于在main函数处加入断电
(gdb) c
该命令运行程序,并在断点处停下
(gdb) n
next
(gdb) p var
显示变量