android中使用gdbserver调试c程序

先废话两句,这篇文章可能有所缺陷,因为我并没有条件去测试动态库的调试。(主要是因为是自己的手机不想乱放各种so)

所以我只能说有空的话我会去进行下测试,这里就先这样了。

1、测试代码gdb-test.c

#include <stdio.h>

int main() {

  printf("this is gdb test !!!\n");

}

 

2、Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := gdb-test.cpp
LOCAL_MODULE        := gdb-test
include $(BUILD_EXECUTABLE)

 

3、 shell中输入

# $NDK/ndk-build NDK_DEBUG=1

强制生成debug版的代码,这里$NDK为ndk根目录。

这时候你会发现有 gdb-test  gdbserver gdb.setup这几个文件生成。

 

4、拷贝gdb-test gdbserver到device的data目录下(这里只是为了简单)

 

5、在shell中输入

# adb shell

进入到device中的shell中

# cd data

# ./gdbserver 192.168.0.235:2000 ./gdb-test

这里假设device的ip地址为192.168.0.235,我们给gdbserver使用的端口为2000

成功的话你会看到

# Listening on port 2000

说明成功开启了服务

 

6、在pc上使用ndk中toolchain提供的gdb,具体路径为

$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb

 

# $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gdb ./gdb-test

注意,这里的gdb-test的位置非常重要,因为你可以看到在libs下有个gdb-test,在obj下也有,为了保证符号表

能成功进行加载,这里必须使用在obj下的gdb-test,因为libs中生成的始终是去掉符号表的,只有objs中的才是真正可调试的。

成功后进入gdb中,输入

# (gdb)target remote 192.168.0.235:2000

 

如果一切正常的话那么应该就可以正常进行调试了。