最近写了些需要跨平台兼容的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/dataadb push ./libmylib.so /system/lib
3. 把设备上的相关调试环境拷贝到本地因为远程调试需要一些目标机的库,把如下文件拷贝到本地文件夹adb pull /system/lib ./debugging/libadb 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.3 从零开始学习—环境的搭建以及Hello world1
  2. (2) Android中Binder调用流程 --- Binder环境的初始化
  3. Android应用程序设置Home Screen
  4. 如何开始使用Android应用程序模板
  5. Ubuntu 9.04安装Android编译环境
  6. Android应用程序键盘(Keyboard)消息处理机制分析(28)
  7. Android监听应用程序安装和卸载

随机推荐

  1. Android compileSdkVersion 23 导致apach
  2. 电话拨号器
  3. 厦门蒙发利科技(集团)股份有限公司面试题
  4. react native修改APP的名称和图标
  5. LogCat中不输出任何的信息
  6. Android sdk配置 常见问题及处理方法
  7. 【android】 Unable to open content: fi
  8. Android AIDL 教程 (一)—— 简单的示例
  9. Android中Toast的用法简介
  10. android 名词搜集