LLDB-iOS高效开发必备利器详解

2021-10-29  本文已影响0人  Peter杰

LLDB

一、什么是lldb

lldb官网文档地址:https://lldb.llvm.org/

LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.

LLDB is the default debugger in Xcode on macOS and supports debugging C, Objective-C and C++ on the desktop and iOS devices and simulator.

lldb是一个高效的debug工具。在大型的LLVM工程中,lldb作为一个可重复使用的组件库被使用,例如作为Clang 解析器或者用于LLVM 反汇编使用。

lldb 是默认被嵌入的Xcode IDE中的,使用Xcode 开发过程中默认支持LLDB调试的,其支持 C、C++、OC语言,同时支持了真机和模拟器。

lldb 支持以下平台:

在上述介绍了lldb的概念提到了LLVM 和Clang解析器,详细了解下这两个名词。

LLVM:LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。

----百度百科

LLVM计划启动于2000年,最初由美国UIUC大学的Chris Lattner博士主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Chris Lattner 同时是Swift创造者。

LLVM的使用

开发硬件平台 Windows Linux Mac OS
在Windows上可以使用Mingw编译LLVM
也可以用VisualStudio 编译 GCC编译或者是以LLVM/Clang编译 Xcode自带

传统的编译器架构

传统编译器架构图.jpeg
  1. Frontend:前端

    前端:词法分析、语法分析、语义分析、生成中间代码

  2. Optimizer:优化器

    优化器:中间代码优化

  3. Backend:后端

    后端:生成机目标器码

LLVM编译器架构

LLVM架构图.png

从LLVM架构图我们可以看出这种架构方案的高明之处。

明白LLVM之后 那Clang 又是起什么作用呢?

Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器

从上面的介绍我们可以看出其实Clang 是基于LLVM框架针对C/C++/Objective-C语言开发出来的一个编译器,不具备通用性和不可移植性。

相比于GCC,Clang具有如下优点

Clang与LLVM关系

Clang与LLVM.png

Clang与LLVM

LLVM整体架构,前端用的是clang,广义的LLVM是指整个LLVM架构,一般狭义的LLVM指的是LLVM后端(包含代码优化和目标代码生成)。

源代码(c/c++)经过clang–> 中间代码(经过一系列的优化,优化用的是Pass) --> 机器码

二、 lldb调试案例

查看lldb调试都支持哪些指令呢?我们可以通过 help 来查找


截屏20210620 下午7.37.32.png

这里只粘贴了部分命令,还有很多命令可支持。

下面介绍几个常用的指令:

还可以调用方法 :(lldb) expression [self testAA] 等同于call的功能

还可以输入命令:所以 expression 的指令包含了p&call的集合

po = **e -O – **

案例修改view颜色

(lldb) po self.view
<UIView: 0x600034cfbe90; frame = (0 0; 844 390); autoresize = W+H; layer = <CALayer: 0x600034cfffe0>>

(lldb) e id $myView = (id)0x600034cfbe90
(lldb) e (void)[$myView setBackgroundColor:[UIColor blueColor]]

截屏20210620 下午11.27.29.png 截屏20210620 下午7.49.19.png

可以看出p 和po都是输出内容的命令,区别是

p 输出包含了数据类型,object类型输出的是对象的指针地址+对象类型,基本类型输出的是 基本类型+值

po输出的是值

(lldb) p name
(NSString *) $0 = 0x000000010d2e2410
(lldb) po name
miqiyy

这里的 2* 是lldb语法累加的结果,从 *0 表示p/po第一条输出,$2表示 第三条输出

p还能控制输出的格式类型: p/

(lldb) po/t 16
0b00000000000000000000000000010000

(lldb) po/x 16
0x00000010

thread return 绕过方法的真正执行,伪造返回值

断点相关

三、LLDB 和Python

lldb支持引入 脚本

(lldb) script import os
(lldb) script os.system("open http://www.objc.io/")
0

通过引入python 直接打开了链接

这样就允许你创造各种酷的命令。把下面的语句放到文件 ~/myCommands.py 中:

<pre style="font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-indent: 0px; text-transform: none; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; box-sizing: border-box; margin: 0px 0px 16px; overflow-wrap: normal; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; line-height: 1.45; overflow: scroll; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; width: 754px; font-variant-ligatures: normal; orphans: 2; text-align: left; widows: 2; text-decoration-thickness: initial; padding: 0px !important; white-space: pre-wrap !important; color: rgb(34, 34, 34) !important;">

def caflushCommand(debugger, command, result, internal_dict): debugger.HandleCommand("e (void)[CATransaction flush]")

</pre>

然后再 LLDB 中运行:

command script import ~/myCommands.py

参考资料:

1、LLVM:https://baike.baidu.com/item/LLVM/3598690?fr=aladdin

2、Clang:https://baike.baidu.com/item/clang/3698345?fr=aladdin

3、理解LLVM:https://www.cnblogs.com/wuhh123/p/10668609.html

上一篇下一篇

猜你喜欢

热点阅读