您的位置:首页 > 移动开发 > Android开发

Android gdbserver远程调试native程序方法

2014-05-09 17:32 671 查看
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即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: