【安卓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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容