文档章节

Android native debug: 手动使用gdbserver远程调试C代码

Q_J
 Q_J
发布于 2015/06/19 14:44
字数 617
阅读 128
收藏 1

一般用java做一个Android app,里面夹杂着jni/*.c 所编译出来的lib,是可以通过gdb来调试的,也许大多数人都在按照网上各种帮助在使用,原理是比较古怪的:app里被塞进去一个gdbserver程序!安装后,会在该app的data目录下出现gdbserver,然后eclipse活着什么别的工具偷偷的启动gdbserver,让他调试改app进程,哦,是通过侦听一个socket,以便让PC端远程发送命令。关于这个网上有不少原理叙述。

但是有时候,就是开发一个和java无关的C程序放在android里运行,要想调试,这么简单的需求,就不想被那些乱七八糟的束缚了,方法基本参照gdbserver标准方法,例如这个。 只是稍微结合一下Android和NDK。

大致如下:

在ndk里找到gdbserver, 例如

find /Applications/android-ndk -type f -name '*gdbserver*' |grep arm

结果

 

/Applications/android-ndk/prebuilt/android-arm/gdbserver/gdbserver
/Applications/android-ndk/prebuilt/android-arm64/gdbserver/gdbserver

Android 5.0之前是第1行,之后是第2行。

把找到的gdbserver传到Android上, 例如

adb push /Applications/android-ndk/prebuilt/android-arm/gdbserver/gdbserver /data/local/tmp/

启动Android里的gdbserver来打开目标C程序,例如a.out

adb shell /data/local/tmp/gdbserver localhost:9999 /data/local/tmp/a.out 目标程序的命令行参数...

结果

Process /data/local/tmp/a.out created; pid = 16236
Listening on port 9999

把本地的9999端口映射到Android上以便以后的操作

adb forward tcp:9999 tcp:9999

至于gdb client,也是在NDK里找出来

find /Applications/android-ndk -type f -name '*gdb' |grep arm

结果

/Applications/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb
/Applications/android-ndk/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb
/Applications/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb

就选最后一行好了。

启动gdb client(当然在PC上)

/Applications/android-ndk//toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb ./a.out
target remote :9999

结果就不啰嗦了,就是个(gdb)提示符,等你输入断点命令(b)和继续命令(cont)还有什么显示代码命令(list)等等,直接在网上找找还快些。

至于如何简单的编译出Android下的C程序,可以参照

拒绝ndk-build (Android Native Development Kit)

 

© 著作权归作者所有

共有 人打赏支持
Q_J

Q_J

粉丝 12
博文 67
码字总数 54682
作品 0
日本
欠揍的ffmpeg,调试android里的ffmpeg (1)

目标问题 对于jpeg的编码为什么不用libjpeg而是用mpeg(没错就是这电影老古董格式)里代码? 其实发现就连wmv等等一些平时用不着的破东西,都是和mpeg老古董共用一套代码。jpeg和mpeg没什么关系...

Q_J
2015/06/24
0
0
[Android]关于Native函数的debug

先占坑,有空发。 环境:WIN7 + eclipse + android sdk4.3 + ndk r9b 需求:安卓程序通过jni调用C代码,并对C代码进行debug。 纠结:1、使用真机,直接无法启动 2、使用模拟器,能够启动,但...

ouczxl
2014/04/24
0
0
从零开始手敲次世代游戏引擎(Android特别篇)-3

在文章从零开始手敲次世代游戏引擎(Android特别篇)-2当中我们完成了执行环境的部署,并打通了开发环境和执行环境。但是到目前为止我们只是完成了C/C++部分的交叉编译,并没有实现Android应...

陈文礼
01/08
0
1
零基础用react-native开发android app

https://segmentfault.com/a/1190000003915315 序 基于雨点儿网,分享react-native开发android app的方法。 这篇博客旨在帮没有任何android或者ios开发经验的开发者体验一把当下热门的react...

james_laughing
09/19
0
0
React-native 文件选择器react-native-file-selector的使用

最后是错误解决办法,本文只说明安装方法,具体使用查看https://github.com/prscX/react-native-file-selector 1、npm install react-native-file-selector --save 2、最好不要自动 link --r...

望-惘-尣
08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

String ,  StringBuffer ,  StringBuilder的区别

String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可...

tsmyk0715
50分钟前
2
0
区块链100讲:UTXO 和 Account 模型对比

在当前区块链世界中,主要有两种记录保存方式,UTXO 模式(Unspent Transaction Output) 和 Account 模式。Bitcoin 采用的是 UTXO 模型,Ethereum 采用的 Account 模型,同样 CITA 也采用了 ...

HiBlock
52分钟前
1
0
Vue中路由管理器Vue Router使用介绍(三)

一、路由定义添加动态参数定义 1.路由定义项,使用:xx 方式 定义动态参数 { path:'/user/:id/:name', name:'user', component:()=>import('./views/User.vue') ...

tianma3798
53分钟前
1
0
从ibdata文件恢复mysql数据

DROP TABLE 恢复【一】 Recover InnoDB dictionary Percona Data Recovery Tool 单表恢复

IT--小哥
56分钟前
1
0
常见设计模式UML图

常见设计模式UML图 本文主要总结常见的设计模式的UML图,方便查阅和思考。 创建型模式 简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和单例模式,这五种设计模式主要处理对象的创建...

陶小陶
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部