【Android源码 栏目提醒】:本文主要为网学会员提供“android中c c 程序的调试 eclipse - 互联网”,希望对需要android中c c 程序的调试 eclipse - 互联网网友有所帮助,学习一下!
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_lidvmtrue虚拟机模块设为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 tcp5039 tcp5039把设备的5039端口映射到PC的5039 设定之后用netstat-na命令可看到PC的5039端口已处于listen状态 注意每次断开手机再连接时都要重新执行该命令 2调试进程号为2014进程 adb shell ps找进程号 gdbserver5039--attach 2014指明tcp端口号和进程号 注意用此方法只适用于对已运行的程序debug不能使用直接在gdbserver后跟程序名的方式运行 此时2014进程被挂起等待调试 4.gdb client端配置 1用命令行工具调试 ANDROID_DIR/prebuilt/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdbANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process 注意可执行程序名必须是app_process不是你所调试的程序名 gdbset solib-absolute-prefixANDROID_SRC/out/target/product/xxxxxx/symbols/system/lib/ gdbset solib-search-pathANDROID_SRC/out/target/product/xxxxxx/symbols/system/lib/ 以上路径为GDB默认库的搜索路径即交叉编译器库路径若不设定则找不到符号表带符号表的库在symbols/system/lib/手机里strip后无符号表的库在syst em/lib/它们必须配套使用 gdbtarget remote5039指明TCP端口号 此时连接gdb server可设断点调试按c继续执行程序 2用eclipse调试 a安装cdt使eclipse支持c/c程序的开发 i.下载 从下载cdt-master-4.0.0.zip ii.解压 mkdir cdtcd cdtunzip./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.新建Cproject菜单File-New-Project… 不使用default location把Location指定成代码所在目录 ii.取消自动编译选项菜单Project-Build Automatically c配置gdb环境 配置Debug Configurations菜单Run-Debug Configurations… i.新建一个C/CLocal Application的debug configuration ii.Main选项卡中 指定Project为新建的C工程 C/CApplications为 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设为一个文件名文件内容如下 fileANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process set solib-absolute-prefixANDROID_SRC/out/target/product/xxxxxx/symbols/system/lib/ set solib-search-pathANDROID_SRC/out/target/product/xxxxxx/symbols/system/lib/ Connection子选项卡 Type设为TCPPort number设为5039 iv.点击Debug按钮进入调试之前挂起的程序此时继续运行 d设置断点及调试 i.找开某一C程序菜单-Open file ii.在程序中双击可设置断点设置后断点出现在右上的Breakpoints中 iii.Debug选项卡提供了工具调试suspendresume等 5.加打印语句 如果需要在C程序中加打印语句有两种方法 1直接在代码中使用printf此方法只能应用于从命令行启动程序的情况运行时可以adb shell中看到打印信息 2使用程序中提供的重定项后的打印语句并在logcat中看到它 例如在libdvm.so中使用dvmFprintfstderrxieyan logn 6.可能出现的问题及解决方法 1在找不到原因时可以写一个在android可以运行的简单c语言程序用gdbserver调试以简化问题android中c程序做法见 我的是在arm-eabi-2.4.1的编译器编出来的你的可能不是编译时用make showcommands确定你的系统使用的编译工具链否则如果你debug时用的和编译时用的版本不一致会导致读符号表时出错注意看提示 3有时编译会引起源码目录的变化请在左侧Project explorer中刷新相关项目 转载请注明出处 MSN空间完美搬家到新浪博客
上一篇:
Android系统架构及其驱动研究
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计