文档章节

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

Q_J
 Q_J
发布于 2015/06/19 14:44
字数 617
阅读 371
收藏 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
日本
私信 提问
加载中

评论(0)

欠揍的ffmpeg,调试android里的ffmpeg (1)

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

Q_J
2015/06/24
426
0
从零开始手敲次世代游戏引擎(Android特别篇)-3

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

陈文礼
2018/01/08
0
1
使用Clion优雅的完全远程自动同步和远程调试c++

摘要:在linux上用vim写C++的时候,通常用gdb进行调试,不能随心所欲的看代码和跳转代码以及加watch(也有可能是因为我还没有get正确的使用方法)。为此我发现Clion可以做到自动同步本场代码...

osc_b4qlyocq
2019/07/14
4
0
零基础用react-native开发android app

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

james_laughing
2018/09/19
51
0
[Android]关于Native函数的debug

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

ouczxl
2014/04/24
1.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7.4解压方式安装mysql5.7

删除Mysql yum remove mysql mysql-server mysql-libs mysql-server; find / -name mysql #将找到的相关东西删掉;例如:rm -rf /var/lib/mysql rpm -qa|grep mysql #(查询出来的东东yum rem......

中颀013
12分钟前
9
0
如何在电脑屏幕上录制视频?安利一款屏幕录像软件

如何在电脑屏幕上录制视频?相信很多小伙伴都会有这个需求,毕竟如今网上有很多教学视频或者游戏直播视频等,它们在市场上有产出所以必定会有大量需求,所以,如果伙伴们也想通过对电脑视频进...

斯卡哈
12分钟前
14
0
SQL笔试 I 经典44题及答案解析

01 建表语句 create table Student(sid varchar(10),sname varchar(10),sage datetime,ssex nvarchar(10));insert into Student values('01' , '赵雷' , '1990-01-01' , '男');insert into......

osc_s4e6jr85
12分钟前
14
0
csharp WebUploader 分块上传

HTML部分 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="up6.index" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://......

osc_afifi2qt
14分钟前
11
0
通信原理的新认识-从实践到原理

在读书期间,本人是学习的通信专业,曾反复研读樊昌信老师写的《通信原理》这本书,一直停留在表面且没有新的理解,直到毕业之后从事通信相关的工作,才在实践层面对通信有了新认识。现就将新...

osc_2mvp7jnu
15分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部