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)
分享到:
相关推荐
- 使用NDK的`gdbserver`进行远程调试C/C++代码。 - Android Studio提供了对JNI代码的调试支持,可以在Java和C/C++之间切换断点。 总结来说,Android调用C/C++主要涉及JNI的使用,包括本地方法声明、头文件生成、C...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,允许Java代码调用本地(C/C++)代码,反之亦然。这对于性能敏感的应用、底层库的集成以及利用现有C/C++库是非常有用的。本教程将聚焦于如何在...
- 在Android Studio中运行或调试应用,验证C/C++代码是否正常工作。 7. **文档与图片** - `调用C++.docx`文件很可能是对整个过程的详细步骤说明,包括如何配置环境、编写代码以及遇到问题时的解决方法。 - 图片...
在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C和C++编写原生代码,并将其集成到Android应用中。这个"Android NDK C/C++ 简单样例"是为初学者设计的,旨在帮助他们理解如何...
Android Studio提供了一些工具来帮助调试JNI代码,如NDK的gdb调试器,以及在Java和C/C++之间传递日志信息。 10. **JNI最佳实践** - 尽量减少Java和C/C++之间的数据交换,因为这是性能瓶颈。 - 使用JNI接口进行大...
Android Studio 调试 C/C++ 代码(so 文件) Android Studio 是一个功能强大的集成开发环境(IDE),它提供了许多强大的功能来帮助开发者更好地开发 Android 应用程序。其中之一就是调试 C/C++ 代码,这篇文章将...
最终,本书的目标是使读者能够在掌握C/C++语言和跨平台开发工具的基础上,学会利用各种技术手段编写可在Windows、MacOSX、iOS、Android和Linux等主流平台上运行的跨平台程序。通过理论与实践相结合的方式,书中将...
在本教程中,我们将深入探讨如何在Eclipse环境中集成NDK,以便更方便地编译和调试C/C++代码。 首先,我们需要了解NDK的基本构成。NDK包含了一系列交叉编译器、链接器和其他工具,用于将源代码转换为适用于不同...
在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言(如C/C++)的代码进行交互。本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题...
在Android开发中,NDK(Native Development Kit)是一个重要的工具集,它允许开发者使用C/C++语言编写高性能、低级别的代码。本教程将基于Eclipse IDE来探讨如何进行NDK开发,包括Java与C/C++之间的互调用。 首先,...
这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...
【C/C++】 C/C++ 是两种常用的编程语言,它们在计算机科学中占有重要的地位。C 语言是一种底层、高效且灵活的语言,适用于系统编程、嵌入式开发以及编写操作系统等。C++ 是 C 语言的扩展,增加了面向对象编程(OOP...
JNI在许多场景下非常有用,比如需要利用已有的C/C++库,或者提高程序的性能,因为本地代码通常可以更高效地执行某些计算密集型任务。本教程将深入讲解如何使用JNI在Java中调用C/C++的本地库。 首先,我们需要理解...
在Android平台上,C和C++语言的开发是高级开发者常用的技术,它们被用来提升应用程序的性能,尤其是在处理图形计算、游戏引擎、系统级编程或与硬件直接交互时。本资料包"Android_C、C++_开发"是为那些希望深入...
本教程将深入探讨Java如何调用C/C++,反之亦然,同时提供实战Demo和调试指南。 1. **JNI基础知识** - **JNI接口定义**:JNI定义了一套接口和数据类型,使得Java和本地代码可以互相调用函数。 - **头文件`jni.h`**...
- **开发工具与环境**:Android Studio等主流IDE已经提供了对C/C++的支持,包括代码编辑、编译和调试功能。此外,第三方库和框架的丰富也大大降低了使用C/C++的门槛。 - **社区与文档支持**:尽管C/C++的资源和文档...
本文将详细介绍如何在Android应用中调用C++/C代码,通过一个实例来阐述这一过程。 首先,理解Android NDK:它是Google提供的一套工具,允许开发者在Android应用中使用原生C/C++代码。这不仅有助于复用已有的C/C++库...
正如文中所述,不同的操作系统如Windows、Mac OS X、iOS、Android以及Linux等,均支持C/C++语言的开发。这是因为C/C++提供了底层硬件访问能力,同时也具备高级语言的特性,能够灵活适应各种不同的操作系统环境。 ##...
【C/C++ Android开发环境配置】是Android原生开发中的重要环节,主要涉及三个关键工具:Android NDK、Android SDK和Ant。以下是这些工具的详细配置步骤和使用方法。 一、Android NDK NDK(Native Development Kit)...
在Android应用开发中,NDK(Native Development Kit)允许开发者使用C/C++代码来实现高性能、低级别的功能。有时,为了调试或者优化这些原生代码,我们需要配置C/C++的日志打印,即Log。本篇文章将详细介绍如何在NDK...