将android ndk下的gdbserver拷贝到设备上,可以通过如下命令
adb push $ANDROID_NDK_ROOT/prebuilt/android-arm/gdbserver/gdbserver /data/
2. 在设备上部署你的Native程序
把你编译出的程序和相关so库部署到设备上,注意,如果有自定义so库,so库要放在/system/lib下,/system路径默认是只读的,可以通过adb remount来重置。
adb push ./hello /data/data
adb push ./libmylib.so /system/lib
3. 把设备上的相关调试环境拷贝到本地
因为远程调试需要一些目标机的库,把如下文件拷贝到本地文件夹
adb pull /system/lib ./debugging/lib
adb pull /system/bin/linker ./debugging/lib
4. 在设备上通过gdbserver运行你的程序
adb shell gdbserver :12345 /data/hello
5. 在本地把本地TCP端口forward到设备的TCP端口
adb forward tcp:12345 tcp:12345
6. 在本地运行Android ndk路径下的gdb程序
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuild/linux-x86 /bin/arm-linux-androideabi-gdb
注意,这里的gdb-test的位置非常重要,因为你可以看到在libs与obj都有hello,为了保证符号表
能成功进行加载,这里必须使用在obj下的hello,因为libs中生成的始终是去掉符号表的,只有objs中的才是真正可调试的。
7. 启动gdb后在gdb下设置solib搜索路径
就是让gdb运行时能够找到调试相关的那些lib,也就是那些第三步中从设备上拉下来的文件。
(gdb) set solib-search-path ./debugging/lib
8. 在gdb下设置你希望调试的Native程序
(gdb) file ./myapp
9. 连接到设备的gdbserver
(gdb) target remote :12345
上面的6~9步也可以通过如下命令一步执行完
$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuild/darwin-x86/bin/arm-linux-androideabi-gdb --eval-command="set solib-search-path ./debugging/lib" --eval-command="file ./myapp" --eval-command="target remote :12345"
10. 开始调试
通过continue或c运行程序。注意不是用run,因为程序在目标机上其实已经启动了,只是break在程序入口。
设置几个断点,然后单步执行。
常用断点设置方法如下:
break 函数名
break 行号
break 文件名:行号
break 文件名:函数名
break +偏移量
break -偏移量
break *地址
info b断点信息
注:出现readchar:Got EOF错误,说明gdbserver与arm-xx-gdb版本不匹配,尝试不同版本的gdbserver即可。