http://blog.csdn.net/dzhj11/article/details/10952571

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


0. 准备工作
首先确保机器上已经有Android开发环境,比如下载了AndroidSDK以及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/prebuild/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等。



更多相关文章

  1. android 程序中选择图片的代码
  2. 常用方法(1)------根据图片的url路径获得Bitmap对象
  3. Android程序调试时生成main.out.xml文件,报错: Resource entry mai
  4. 使用android中的AIDL让Service与Activity通信[转]
  5. 申请Android(安卓)Google Map API key
  6. 【Android(安卓)学习系列】 内存泄露(一)
  7. android GMS认证之CTS测试命令详细
  8. android 6.0 不弹允许usb调试 授权对话框
  9. Android(安卓)studio 中 Gradle手动下载安装集成。方案一,Use def

随机推荐

  1. 一起学android之如何获取网络类型并判断
  2. MTK Android(安卓)Driver知识大全
  3. 我的第一个 Mono for Android(安卓)应用
  4. Android(安卓)Camera(五)
  5. 安卓开发环境AS2.0搭建
  6. android adb shell 笔记
  7. android点击事件
  8. android的学习(一)环境搭建
  9. Android(安卓)AIDL 教程 (一)—— 简单的
  10. Android(java)学习笔记76:多线程-定时器概述