使用GDB调试Android NDK native(C/C++)程序-转

最 近写了些需要跨平台兼容的C++库,Android是其中需要兼容的平台之一。区别于Windows,Mac中功能强大的IDE环境,官方并没有为 Android ndk提供太多的支持。因此,尝试了下通过一些配置使用gdb来调试Android ndk的C++程序,感觉还算方便,记录下来跟大家分享。

先 说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程 序,push到Android设备或者仿真器上,然后在设备上运行该程序。而调试则是通过attach到gdbserver来实现。推荐在Ubuntu或 者mac osx下来进行,windows下要安装cygwin来模拟posix环境,速度很慢的说。具体操作如下:

0. 准备工作


先确保机器上已经有Android开发环境,比如下载了Android
SDK以及NDK包,配置了相关环境变量,启动了Android设备或者仿真器等等。当然你也需要编译生成了带有调试Symbol的Native程序,我
是用NDK下的gcc编译器通过自己配置编译环境来进行编译的,当然你也可以直接使用ndk-build。

1. 在设备上部署gdbserver

所谓部署其实就是把android ndk下的gdbserver拷贝到设备上,可以通过如下命令

adb push $ANDROID_NDK_ROOT/prebuilt/android-arm/gdbserver/gdbserver /data

2. 在设备上部署你的Native程序

需要把你编译出的程序和相关so库部署到设备上,注意so库要放在/system/lib下,/system路径默认是只读的,可以通过adb remount来重置。

adb push ./myapp /data/data

adb push ./libmylib.so /system/lib

3. 把设备上的相关调试环境拷贝到本地

因为远程调试需要一些目标机的库,把如下文件拷贝到本地文件夹

adb pull /system/lib ./debugging/lib

adb pull /system/bin/linker ./debugging/lib

4. 在设备上通过gdbserver运行你的程序

adb shell gdbserver :12345 /data/data/myapp

5. 在本地把本地TCP端口forward到设备的TCP端口

adb forward tcp:12345 tcp:12345

6. 在本地运行Android ndk路径下的gdb程序

$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuild/darwin-x86/bin/arm-linux-androideabi-gdb

这里注意如果你在Ubuntu下用的是Linux的NDK包,那路径会有点不同,darwin-x86的地方应该是linux-x86.最保险的还是自己在NDK下搜索。

7. 启动gdb后在gdb下设置solib搜索路径

就是让gdb运行时能够找到调试相关的那些lib,也就是那些第三步中从设备上拉下来的文件。

(gdb) set solib-search-path ./debugging/lib

8. 在gdb下设置你希望调试的Native程序

(gdb) file ./myapp

9. 连接到设备的gdbserver

(gdb) target remote :12345

上面的6~9步也可以通过如下命令一步执行完

$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86/bin/arm-linux-androideabi-gdb
--eval-command="set solib-search-path
./debugging/lib"  --eval-command="file  ./myapp" --eval-command="target
remote :12345"

10. 开始调试

通过continue或c运行程序。注意不是用run,因为程序在目标机上其实已经启动了,只是break在程序入口。

本文不会讨论gdb调试命令的具体用法,相关文章网上应该很多,或许后续会写篇使用gdb的心得体会。另外也可以把编译和调试命令配置到一些通用IDE中更方便使用,比如eclipse,codeblocks等。

时间: 2024-10-17 17:13:08

使用GDB调试Android NDK native(C/C++)程序-转的相关文章

使用GDB调试Android NDK native(C/C++)程序

使用GDB调试Android NDK native(C/C++)程序 先说明下,这里所谓的ndk native程序跟Android上层java应用没有什么关系,也不需要涉及jni来封装native接口,通俗来讲,就是把编译好的纯C/C++程序,push到Android设备或者仿真器上,然后在设备上运行该程序.而调试则是通过attach到gdbserver来实现.推荐在Ubuntu或者mac osx下来进行,windows下要安装cygwin来模拟posix环境,速度很慢的说.具体操作如下: 0.

Eclipse+CDT+GDB调试android NDK程序(转)

Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for java jdk 6 android sdk 2.2 andrid ndk r7 当然,在windows环境下通过cygwin等工具也是可以实现gdb调试的,我也确实实现过.但是性能实在太低,卡的根本没法用.Linux下直接用gdb调试本地方法是很流畅的. 再确定安装并配置好开发环境之后,就可以开始了.

Eclipse替代ndk-gdb断点调试Android NDK程序

一 概述: Eclipse调试NDK程序的操作并不难,难的是环境的搭建.光是安装Eclipse就有不少问题,真是"大错不犯,小过不断"不胜期烦.在网上,已经有先行者记录下了Eclipse断点调试Android NDK程序的方法: <Eclipse + ADT(包括NDK Plugin) + CDT 搭建Android NDK开发环境>网址:http://blog.sina.com.cn/s/blog_48ed03c80101nhei.html 我遇到的情况与上文有些不同,上

Android NDK环境快3程序出售搭建,需要cygwin

前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员来讲,基本够用了,由于Linux系统的权限限制和Android封装架构限制,很多涉及底层设备.接口.驱动控制的应用开发,不得不使用到快3程序出售QQ2952777280[] hxforum.com 本文的NDK开发环境(基于Android源码或内核源码修改),开发语言使用C/C++,NDK开发更接近于Linux开发,需要更多关于Linux应用编程知识.本文就介绍一下NDK环境搭建及基础编

Android NDK工程的编译和链接调试

前提条件:已经安装了JDK 6.0.android SDK.NDK r9和eclipsele4.2开发环境. 推荐下载Android开发的综合套件adt-bundle-windows-x86,再下载Android NDK既可以开始Android NDK程序的编程了. 1.     首先在eclipsele4.2上创建一个空的Android工程,无所谓,只要是一个Android工程就OK了. 2.     安装NDK开发的插件com.android.ide.eclipse.ndk_23.0.2.1

Android NDK调试出错Unknown Application ABI, Unable to detect application ABI&#39;s的解决方案

今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了好久,终于找到了解决方案: 在工程的jni文件夹下面新建一个Makefile类型的文件,文件名为Application.(注:如果你不知道怎么新建Makefile类型的文件,可以把jni文件夹下的Android.mk文件在原地复制一份,打开之后修改里面的内容即可). 如下图: Android NDK

Android NDK调试出错Unknown Application ABI, Unable to detect application ABI&amp;#39;s的解决方式

今天在调试Android NDK的时候,ADT的控制台报了这个错误: Unknown Application ABI, Unable to detect application ABI's 在网上查了好久.最终找到了解决方式: 在project的jni目录以下新建一个Makefile类型的文件,文件名称为Application. (注:假设你不知道怎么新建Makefile类型的文件,能够把jni目录下的Android.mk文件在原地复制一份.然后重命名为Application.打开Applica

Android NDK之JNI陷阱

背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI(java native interface)经常遇到到问题. 问题1.  忘记delete local reference.带New到方法(如:NewByteArray)这样到方法比较好辨认,需要手动调用DeleteLocalRef()来释放(返回值除外).比较特殊的一个方法是:GetByteAr

Android NDK开发的一些技巧

Android NDK(Native Development Kit)是基于Java JNI的使用C/C++和Java来混合开发应用的一种方式,甚至在Android 2.3(API 9)以后可以用Native(Native这个字在不同的语境中意义是不一样的,这里指的是JNI中的C/C++的代码:如果放在Hybrid中Native就是指平台原生的语言和API)代码来创建标准界面组件Activity,换句话说就可以用纯C/C++来写一个Android应用,但是貌似还没有人这么干过,这只是一种理论上的