Android gdbserver远程调试native程序方法

PC上使用gdb远程调试android native程序

准备工作:
android native程序:hello
android 上运行调试工具:gdbserver
pc上调试工具:arm-xxx-gdb

0.编译native程序
添加编译选项-g 
去掉编译选项 strip

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS += -g -O3 -fvisibility=hidden
LOCAL_MODULE := hello
LOCAL_SRC_FILES := main.c \
       kernelMsgParser.c \
       socketserver.c\
       utils.c \
       recvkernel.c
#cmd-strip = $(TOOLCHAIN_PREFIX)strip $1
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -lz -llog
#include $(BUILD_SHARED_LIBRARY)
include $(BUILD_EXECUTABLE)

1. 在设备上部署gdbserver

将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即可。


你可能感兴趣的:(android调试)