IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 【安卓framework实战】使用lldb调试Android native源码 -> 正文阅读

[移动开发]【安卓framework实战】使用lldb调试Android native源码

一、环境准备

1.1 安装llvm

安装方法参考:https://apt.llvm.org/。

为了方便起见,有一个自动安装脚本可用于安装LLVM。要安装最新的稳定版本:

$ bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

要安装特定版本的LLVM:

$ wget https://apt.llvm.org/llvm.sh
$ chmod +x llvm.sh
$ sudo ./llvm.sh <version number>

安装完毕之后,在终端输入

$ lldb-<version number>

若能够进入lldb模式,则表示安装成功。

1.2 开启lldb-server服务

在Android SDK目录,其中Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/9.0.8/lib/linux/aarch64/lldb-server就是我们要的服务。

执行以下命令,将其push进手机,并开启。

$ adb push lldb-server /data/local/tmp/
$ adb shell 
$ cd /data/local/tmp
$ chmod 755 lldb-server
$ ./lldb-server p --server --listen unix-abstract:///data/local/tmp/debug.sock

保持当前终端不要关闭,进程会一直执行,这样lldb-server就启动了。

1.3 使用lldb连接lldb-server

打开另一个终端,执行以下命令,在ubuntu上使用lldb连接lldb-server

$ lldb-<version>
$ platform list  # 查看lldb可以连接的平台
$ platform select remote-android
$ platform status # 查看平台状态
$ platform connect unix-abstract-connect:///data/local/tmp/debug.sock

当出现以下输出,则表示已经连接成功。其中

在这里插入图片描述

二、使用lldb调试Android native源码

调试native源码有两种方式:

  1. 调试二进制文件
  2. 调试进程

2.1 调试二进制文件

我已经编译好一个二进制文件,logd。本地编译之后在安卓源码根目录的out/target/product/darwin/system/bin/下会有logd的可执行文件,将手机remount之后push至/system/bin。

在out/target/product/darwin/symbols/system/bin中会有该logd可执行文件的symbol。

logd是一个安卓native进程,根据其结尾的d可以知道这是一个守护进程。在安卓源码编译时,会将logd编译成一个二进制可执行文件,放在“/system/bin”目录下,可以通过adb命令查看此文件。

在这里插入图片描述

该二进制文件由多个cpp文件编译而成,其中有一个文件为LogBuffer.cpp,位于源码目录system/core/logd/下。

接下来,我们要对LogBuffer.cpp的LogBuffer::prune()函数的第一行进行断点,710行,并打印其堆栈。

将终端cd到安卓源码根目录,执行以下命令:

(lldb) file out/target/product/darwin/symbols/system/bin/logd # 指定将要调试的二进制文件,该文件需要是symbol文件。
(lldb) breakpoint set -f LogBuffer.cpp -l 710
(lldb) run

这样就在LogBuffer.cpp的710行打上了断点。

打开另一个终端,执行

$ adb logcat -c

会有以下输出,程序成功断在这里。
在这里插入图片描述

执行以下命令打印堆栈:

(lldb) bt

在这里插入图片描述

2.2 调试进程

(lldb) file  out/target/product/darwin/symbols/system/bin/logd # 指定将要调试的二进制文件,该文件需要是symbol文件。(lldb) platform process list # 查看一直远端的进程, 找到目标进程pid, 或者名称(lldb) attach 9053

这样就attch到9053进程上,可以打上断点进程调试。

三、lldb调试命令

b = breakpoint 设置断点
c = continue 继续运行
n = next 下一行
s = step 单步进入
f = finish 跳出

p [var] 打印变量值
var 显示所有局部变量
bt 打印调用栈
up 在调用栈中向上移一帧 older
down 在调用栈中下移一帧 newer

register 查看寄存器
memory 查看内存

更多命令可以查看:https://lldb.llvm.org/use/tutorial.html

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:42:39  更:2021-11-12 19:42:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:46:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码