`
isiqi
  • 浏览: 16033759 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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端口映射到PC5039
设定之后用netstat -na命令可看到PC5039端口已处于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. 将解压缩后的featuresplugins两个文件夹的内容复制到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 Applicationdebug configuration

ii. Main选项卡中
指定Project为新建的C++工程,
C/C++ Applications
:
$ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process

iii. Debugger选项卡中
指定Debuggergdbserver 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
设为TCPPort 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调试,以简化问题,androidc程序做法见:
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

分享到:
评论

相关推荐

    Android Cocos2dx 之用eclipse开发调试c++

    NULL 博文链接:https://cindy-lee.iteye.com/blog/1718657

    详解如何使用Android Studio 进行NDK开发和调试

    JNI 是Java Native Inteface的缩写,是Java中定义的一种用于连接Java和C/C++接口的一种实现方式。 NDK NDK 是 Native Developmentit的缩写,是Google在Android开发中提供的一套用于快速创建native工程的一个工具。 ...

    《Android C++高级编程——使用NDK》_源码.zip

    主要内容:● 使用JNI将原生代码连接到Java中● 使用SWIG自动生成JNI代码● 使用POSIX线程实现多线程应用● 使用POSIX套接字实现网络应用● 使用logging、GDB和Eclipse调试器进行调试● 使用Valgrind分析内存● 使用...

    Android C++高级编程: 使用NDK

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    Android C++高级编程使用NDK

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    pro-android-c-w-ndk-master.tar

    《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去实现自己的Android应用中对性能要求较高的部分。  《移动开发经典丛书·Android C++高级编程:使用NDK》介绍了...

    Android传感器MotionSensor开发实验.pdf

    b) 程序库 (LIBRARIES) 程序库是指可供使⽤的各种标准程序、⼦程序、⽂件以及它们的⽬录等信息的有序集合,Android包含⼀些C/C++库,Android系统中不同的 组件通过应⽤程序框架可以使⽤这些库本地框架是有C/C++实现。...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版 原书名:Pro Android C++ with the NDK 原出版社: Apress 作者: (美)Onur Cinar 译者: 于红 佘建伟 冯艳红 丛书名: 移动开发...

    Android应用程序开发教程PDF电子书完整版、Android开发学习教程

    Android 包含一些 C/C++库,这些库能被 Android 系统中不同的组件使用。它们通过 Android 应用程序框架 为开发者提供服务。以下是一些核心库: • 系统 CCCC 库 - 一个从 BSD 继承来的标准 C 系统函数库( libc ),...

    windows,eclipse,c++,cocos2dx游戏开发环境搭建 2.doc

    3.在eclipse里面自动编译有c++代码的android项目并运行和打包。4.其实还想在eclipse里面实现c++代码的调试,只是这个步骤暂时还没有摸索出来。三,前提条件:1.eclipse中有adt和cdt插件(一般现在的a

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    android ndk-stack使用说明。

    使用cocos2d-x,jni,和android ndk,开发调试无从着手是吧,那就来使用ndk-stack吧,让你轻松自如的在eclipse下,android下调试c/c++吧。嘻嘻。好东西要分享哦。

    eclipse cdt 配置相关文件

    从create-android-project.bat开始创建eclipse下可调试的cocos2dx c++工程 文章中用到的资源

    2010年谢彦的android笔记

    3.5.5 c++程序的调试 110 3.5.6 测试工具CTS 113 3.5.7 解决eclipse无法识别API的问题 115 3.5.8 调试方法补充 116 3.6 换肤(theme) 118 3.6.1 当前的换肤方法(theme) 118 3.6.2 制作换肤包 120 4 android架构层分析...

    Android开发案例驱动教程 配套代码

    Java或C++程序员转变成为Android程序员 采用案例驱动模式展开讲解知识点,即介绍案例->案例涉及技术->展开知识点->总结的方式 本书作者从事多年一线开发和培训,讲解知识点力求细致,深入浅出 目 录 前言 第1章...

    阿里云javasdk源码-android-native-debug:调试Android框架原生代码教程

    ,但是只提到了Framework中Java代码的调试办法,但实际上有很多代码都是用C++实现的;无奈当时并并没有趁手的native调试工具,无法做到像Java调试那样简单直观(gdb+eclipse/ida之流虽然可以但是不完美),于是就...

    《Android应用开发揭秘》附带光盘代码.

     2.3.3 调试HelloAndroid  2.4 小结  第二部分 基础篇  第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U...

    《Android应用开发揭秘》源码

     2.3.3 调试HelloAndroid  2.4 小结  第二部分 基础篇  第3章 Android程序设计基础  3.1 Android程序框架  3.1.1 Android项目目录结构  3.1.2 Android应用解析  3.2 Android的生命周期  3.3 Android程序U...

    pro_android_cpp_with_the_ndk.pdf

    第1章 Android平台上的C++入门 1.1 Microsoft Windows 1.1.1 在Windows平台上下载并安装JDK开发包 1.1.2 在Windows平台上下载并安装ApacheANT 1.1.3 在Windows平台上下载并安装AndroidSDK 1.1.4 在Windows平台上下载...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

Global site tag (gtag.js) - Google Analytics