GDB在线调试Android Framework Native C/C++代码

简介: 一、准备工作1、下载并编译Android系统源码这里比较灵活,可以下载公司内部机型的代码,也可以下载原生AOSP的代码环境配置参考 https://source.

一、准备工作

1、下载并编译Android系统源码

这里比较灵活,可以下载公司内部机型的代码,也可以下载原生AOSP的代码

环境配置参考

https://source.android.com/source/initializing.html

源码下载参考

https://source.android.com/source/downloading.html

编译运行参考

https://source.android.com/source/building.html

全部编译整个代码工程,中间如果有什么问题可以参考

https://source.android.com/source

2、设置PC端环境

如果要调试自己build的版本,就可以使用out目录下的symbols
PC env setup
这里带一句,symbols是带有debug信息的二进制库或可执行文件,用以调试

除了symbols之外我们还需要gdb(client),可以在源码目录的prebuilts目录下找到他们,为了方便,可以直接设置环境变量
PC env setup2

3、获取调试的权限

最好使用userdebug或者eng build,实在不行也可以使用root后的user build系统,但是要同时关掉selinux

adb shell setenforce 0

否则无法调试

4、设置手机端环境

如果是user build,手机中没有gdbserver,所以需要手动push一个,gdbserver可以去源码目录下的prebuilts目录中搜索一下,但是这里要区分一下gdbserver和gdbserver64
phone env setup
如果是要调试64位的进程就需要gdbserver64
phone env setup2

通过以下命令push到手机中

adb root
adb disable-verity
adb reboot

等待重启完成

adb remount
adb push prebuilts/misc/android-arm/gdbserver/gdbserver /system/bin/

phone env setup3

二、开始调试

这里假设要调试的是zygote进程,首先要知道zygote进程对应的可执行文件,这里是app_process32,64位的zygote64对应的是app_process64

1、gdbserver attach到想要调试的进程

adb shell
ps | grep zygote
gdbserver :1991 --attach 303

这里的端口可以随便指定一个空闲的即可
gdbserver attach

2、gdb client连接到gdbserver

通过执行以下命令进行连接

adb forward tcp:1991 tcp:1991
arm-linux-androideabi-gdb
target remote:1991

这里需要说一下,如果需要调试的进程是64位的,就要用64位的gdb client然后配合gdbserver64

aarch64-linux-android-gdb

3、load对应可执行文件

file /Volumes/1TB-HD/Images/cancro/16.11.01/compressed_cancro_mm-alpha_2016.11.01.18.08_0e62b9421b/out/target/product/cancro/symbols/system/bin/app_process32

4、Set sysroot路径

set sysroot /Volumes/1TB-HD/Images/cancro/16.11.01/compressed_cancro_mm-alpha_2016.11.01.18.08_0e62b9421b/out/target/product/cancro/symbols

gdb client setup

5、设置源码目录

set dir /Volumes/1TB-HD/CodeRoot/CANCRO_ALPHA/

6、设置断点

b frameworks/base/core/jni/fd_utils-inl.h:180

Breakpoint 1 at 0xb6e24f0c: file frameworks/base/core/jni/fd_utils-inl.h, line 180.

7、继续运行

c

Continuing.
[New Thread 5872]
[New Thread 5873]
[New Thread 5874]
[New Thread 5875]

操作并等待运行到断点处

Breakpoint 1, FileDescriptorInfo::Restat (this=0xb4cbd620) at frameworks/base/core/jni/fd_utils-inl.h:182
warning: Source file is more recent than executable.
182       ALOGE("Restat, st_nlink == 8, (%s, fd=%d) : f_stat.st_nlink=%llu,0x%llX file_stat.st_nlink=%llu,0x%llX", 

8、查看变量对应的值

p f_stat.st_nlink

$1 = 1

gdb client setup

三、扩展功能

到这里对于刚接触gdb调试同学也有了入门的知识,对于gdb老手估计是要玩飞的节奏。。。

但是这里要说一下,如果要调试的是framework相关的进程的native代码,可能会受到system server的watchdog的影响,1分钟没有及时响应操作就会触发watchdog而kill到system server进程,zygote也会跟着挂掉,这里有个小技巧可以用一下,就是在调试的过程中,如果需要耗时查看一些运行时状态,可以先执行
adb shell am hang
防止超时重启,查看完毕想要继续执行,就Ctrl+c终止掉am hang即可继续执行,后面就重复这个过程即可。
另外还有一种方式就是用Android Studio在线调试,把断点加在watchdog里面,配置gdb native调试。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
136 0
|
12天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。
|
17天前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
59 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
1月前
|
存储 Java Android开发
🔥Android开发大神揭秘:从菜鸟到高手,你的代码为何总是慢人一步?💻
在Android开发中,每位开发者都渴望应用响应迅速、体验流畅。然而,代码执行缓慢却是常见问题。本文将跟随一位大神的脚步,剖析三大典型案例:主线程阻塞导致卡顿、内存泄漏引发性能下降及不合理布局引起的渲染问题,并提供优化方案。通过学习这些技巧,你将能够显著提升应用性能,从新手蜕变为高手。
20 2
|
28天前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
28天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
28天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
28天前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
Java Android开发
Android源码剖析之Framework层升级版(窗口、系统启动)
 本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了framework的整体层次和基础定义与服务,接下来我们讲讲窗口的创建,底层与应用层界面的交互和管理。
1342 0
|
13天前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。