`
globaldev
  • 浏览: 34644 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android调试c/c++

阅读更多
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)
分享到:
评论

相关推荐

    Android JNI 断点调试C++

    Android JNI 断点调试C++,一个简单测试,方便初学者入门NDK环境搭建和java调用c++并调试

    浅谈Android Studio如何Debug对应so文件C/C++代码

    在C/C++跨平台开发中,我们知道在Windows上可以通过VS,进行单步断点...1、The Android Native Development Kit (NDK) : 让你能在 Android 上面使用 C 和 C++ 代码的工具集。 2、CMake 外部构建工具。如果你准备只使用

    Android源代码开发和调试环境搭建完整版PPT

    Android源代码开发环境与SDK开发环境相比,优势是可以查看和调试系统源代码,包括Java代码和C/C++代码。这对应用开发也是非常有用的,因为在开发中碰到疑难杂症时可以跟踪到系统内部去定位问题。对于涉及到C/C++代码...

    Android中的反调试代码

    Android中反调试案例Android中反调试案例Android中反调试案例Android中反调试案例

    C-Free5.0安装包(包含TDM_GCC-5.1.0编译器)

    利用本软件,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。 2.TDM-GCC 是 Windows下的编译器套件,它结合了 GCC 工具集中最新的稳定发行版本,包括了自由并开源的 MinGW 或 MinGW-w64 的运行时 APIs,...

    Android项目_jni操作指南.rar

    JNI是Android中Java与本地代码(如C/C++)进行交互的关键技术,它允许开发者利用原生库实现高性能、底层功能等需求。 这份指南内容涵盖了以下几个方面: 1. JNI基本概念及原理:介绍了JNI的基本概念、工作原理以及...

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

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

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

    《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...

    Android--user-Interface.rar_android开发_C/C++_

    本程序是Android环境下开的工具,实现了基本的用户界面,调试已经通过

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

     Android允许应用开发者通过Android原生开发包(NDK)使用诸如C和C++之类的原生代码语言实现他们的部分应用。《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去...

    移动应用安全加固.pdf

    C/C++/ObjC- AndroidSo、Applemach-o 各种开发框架的文件:html、Js、Lua、C#等 Dex加固 第 代整体加密 -第一代整体加密技术 Dex加固 第二代 第一代第二代混合加固 C/C++/ObjC的保护 So保护-binary level So保护...

    RenderDoc是一个独立的图形调试工具。-C/C++开发

    RenderDoc是基于帧捕获的图形调试器,目前可用于Windows 7-10,Linux,Android,Stadia和Nintendo Switch:trade_mark:上的Vulkan,D3D11,D3D12,OpenGL和OpenGL ES开发。 它在RenderDoc下是完全开源的,是基于帧...

    DebugJni.7z

    如题,使用Android studio开发jni代码 c/c++ ,实现单步调试,可以同时调试UI和c/c++代码。

    Android C++高级编程使用NDK

     Android允许应用开发者通过Android原生开发包(NDK)使用诸如C和C++之类的原生代码语言实现他们的部分应用。《移动开发经典丛书·Android C++高级编程:使用NDK》中我们将学习如何用AndroidNDK通过原生代码语言去...

    Android Studio3.0开发JNI流程------在Android程序中添加自己的类的native方法

    在支持C/C++的android程序中添加自己类的native方法,以及不同怎么生成多个so库

    汽车电子实践报告

    C/C++基础,java编程基础,Linux c应用开发,Android app开发,自动控制原理,数字电路设计,模拟电路设计,传感器原理,无线通信原理,CAN网络编程等 2 基本技能 C/C++编程基础,java编程基础,Linux c应用...

    SocketTool工具源码

    建立Socket测试服务器端和测试客户端,并向支持各个端发送或接受报文数据,支持自动发送和自动应答,支持UDP和TCP,广播和组播,软件源码可以编译成功功能基本可用,希望和大家一起学习;我会定期把需要下载的积分降...

    AntTweakBar.zip

    AntTweakBar.zipAntTweakBar是一个小和易于使用的C / c++库,允许程序员快速光和直观的图形用户界面添加到图形应用程序基于onOpenGL(兼容性和核心配置文件),举举9日10或11举屏幕交互地调整参数。 C / c++变量可以...

    完美兼容第3方GUI框架(Qt/MFC/Winform/Cocoa/Web)

    支持的开发语言: C/C++, Swift, Java, Javascript, C#, Golang... 支持的第3方库:Qt, MFC, Winforms, CoCoa... 学习方法 编译GUI-lite库 编译、调试:HelloXXX实例程序 研读、修改100+行的HelloXXX/UIcode/UIcode...

Global site tag (gtag.js) - Google Analytics