使用GDB调试Android NDK native(C/C++)程序
来源:互联网 发布:豫广网络工资有保证吗 编辑:程序博客网 时间:2024/05/22 02:17
最近写了些需要跨平台兼容的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
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等。
转载地址:http://blog.csdn.net/my_business/article/details/8735410
0 0
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用GDB调试Android NDK native(C/C++)程序
- 使用ndk-gdb调试android native程序
- 使用GDB调试Android NDK native程序
- android如何使用ndk-gdb调试native程序
- Android Native C程序使用GDBServer调试
- Android使用ndk-gdb调试jni程序
- Android Studio 调试 Native 、NDK,C
- 使用gdb调试C程序
- Android使用gdb调试native程序
- 如何使用arm-eabi-gdb调试android c/c++程序
- 如何使用arm-eabi-gdb调试android c/c++程序
- 如何使用arm-eabi-gdb调试android c/c++程序
- 使用GDB调试Android中的C/C++程序
- 使用gdb在Android Emulator中进行调试c程序
- 如何使用arm-eabi-gdb调试android c/c++程序
- 设计模式之内容观察者模式
- 黑马程序员-交通灯管理系统学习日记
- Android--Dialog,Dialog 的几种使用方法
- 第五章作业
- dev-C++五子棋
- 使用GDB调试Android NDK native(C/C++)程序
- SQL Server的日期数据类型
- 服务器优化-切分
- xen-4.04 编译问题
- Android 开发,应用的图标已经换了,运行的时候还是默认的安卓机器人
- DataGridView在Cell编辑状态响应回车键下的KeyPress/KeyDown/KeyUp事件
- 自定义UITableViewCell的样式
- C++ 一个程序兼容冒泡、插入、基数三种排序算法
- Google App Engine技术架构之Google的核心技术(1)