您的位置:首页 > 编程语言 > C语言/C++

android中c/c++程序的调试(eclipse)

2012-11-01 15:33 453 查看
android中c/c++程序的调试(eclipse)

1. 使用gdbserver调试

使用JDWP只能调试java层面的程序,如果想调试C层面的代码,需要使用gdbserver方式,gdbserver的服务端和客户端都包含在android的源码中。

server端是out/target/product/xxxxxx/system/bin/gdbserver。

client端是prebuild/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb),不需另外安装。

(请看完本文再开始调试,尤其是“注意”部分)

本文依据张博的调试文档, 加以扩充说明,感谢原创者。

2. 调试前的准备:编译DEBUG版本的程序和库

1) 新建(或修改)ANDROID源码根目录的buildspec.mk,加入以下内容

DEBUG_MODULE_lidvm:=true # 虚拟机模块设为debug

TARGET_CUSTOM_DEBUG_CFLAGS:=-O0 -mlong-calls

(请修改具体模块名,我调试的是虚拟机的libdvm.so库)

2) 重编dalvik模块

$ make clean-libdvm

$ make dalvik snod

3) 重烧system.img或替换手机中的相应模块

3. gdb server端配置

1) 端口映射

$ adb forward tcp:5039 tcp:5039 把设备的5039端口映射到PC的5039

设定之后用netstat -na命令可看到PC的5039端口已处于listen状态

注意每次断开手机再连接时,都要重新执行该命令

2) 调试进程号为2014进程

$ adb shell

# ps 找进程号

# gdbserver :5039 --attach 2014 # 指明tcp端口号和进程号

注意:用此方法只适用于对已运行的程序debug(不能使用直接在gdbserver后跟程序名的方式运行)

此时2014进程被挂起,等待调试

4. gdb client端配置

1) 用命令行工具调试

$ $ANDROID_DIR/prebuilt/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb $ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process

注意可执行程序名必须是app_process,不是你所调试的程序名

(gdb) set solib-absolute-prefix $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/

(gdb) set solib-search-path $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/

以上路径为GDB默认库的搜索路径,即交叉编译器库路径,若不设定,则找不到符号表,(带符号表的库在symbols/system/lib/*,手机里strip后无符号表的库在system/lib/*,它们必须配套使用)

(gdb) target remote :5039 指明TCP端口号

此时连接gdb server,可设断点调试,按c继续执行程序

2) 用eclipse调试

a) 安装cdt,使eclipse支持c/c++程序的开发

i. 下载

从http://www.eclipse.org/cdt/downloads.php下载cdt-master-4.0.0.zip

ii. 解压

$ mkdir cdt; cd cdt; unzip ../cdt-master-4.0.0.zip

iii. 将解压缩后的features、plugins两个文件夹的内容复制到Eclipse安装目录中

$ cp plugins/* ../../eclipse/plugins/

$ cp features/* ../../eclipse/features/

iv. 重新开启Eclipse即可

$ eclipse -clean

在新建project中即可看到c/c++相关选项,说明已安装成功

b) 加入要调试的代码

i. 新建C++ project (菜单File->New->Project…)

不使用default location,把Location指定成代码所在目录

ii. 取消自动编译选项(菜单Project->Build Automatically)

c) 配置gdb环境

配置Debug Configurations(菜单Run->Debug Configurations…)

i. 新建一个C/C++ Local Application的debug configuration

ii. Main选项卡中

指定Project为新建的C++工程,

C/C++ Applications为:

$ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process

iii. Debugger选项卡中

指定Debugger为gdbserver Debugger,

Main子选项卡的Gdb debuger设为:

$ANDROID_DIR/prebuilt/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb

GDB command file设为一个文件名,文件内容如下:

file $ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process

set solib-absolute-prefix $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/

set solib-search-path $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/

Connection子选项卡:

Type设为TCP,Port number设为5039

iv. 点击Debug按钮进入调试,之前挂起的程序此时继续运行

d) 设置断点及调试

i. 找开某一C程序(菜单->Open file)

ii. 在程序中双击可设置断点,设置后断点出现在右上的Breakpoints中

iii. Debug选项卡提供了工具调试(suspend, resume等)

5. 加打印语句

如果需要在C程序中加打印语句,有两种方法

1) 直接在代码中使用printf,此方法只能应用于从命令行启动程序的情况,运行时可以adb shell中看到打印信息

2) 使用程序中提供的重定项后的打印语句,并在logcat中看到它

例如在libdvm.so中使用dvmFprintf(stderr, “xieyan log\n”);

6. 可能出现的问题及解决方法

1) 在找不到原因时,可以写一个在android可以运行的简单c语言程序用gdbserver调试,以简化问题,android中c程序做法见:
http://www.top-e.org/jiaoshi/html/?157.html
2) 我的是在arm-eabi-2.4.1的编译器编出来的,你的可能不是,编译时用make showcommands 确定你的系统使用的编译工具链,否则如果你debug时用的和编译时用的版本不一致,会导致读符号表时出错(注意看提示)

3) 有时编译会引起源码目录的变化,请在左侧Project explorer中刷新相关项目

(转载请注明出处:http://xy0811.spaces.live.com)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: