LLDB介绍

主要介绍一下LLDB常用命令,及其插件chisel的使用

编译器背景知识

1. 编译器的前端与后端之分

根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。

前端

主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间表示生成。

后端

主要指与目标机有关的部分,包括代码优化和目标代码生成等

2. llvm_arc图

_config.yml

历史背景1

背景1:

Apple(包括中后期的NeXT) 一直使用GCC作为官方的编译器,

Xcode4,LLVM-GCC成为默认编译器,但GCC仍保留

老版使用的是GDB,xcode自4.3之后默认使用的就是LLDB了

GCC

GCC 原名为 GNU C 语言编译器,因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada与其他语言

GCC的后端RTL

GDB

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具

背景2:

Apple 大量使用的 Objective-C 在 GCC 中优先级很低

仗着自己在开源社区的地位,GCC 开发者对Apple的Objective-C语言新增的很多特性(甚至后来对C语言)不予理睬,甚至当Apple想做的很多功能需要用模块化的方式来调用 GCC时,GCC却一直不给做

背景3:

Chris Lattner 克里斯·拉特纳

_config.yml

LLVM(Low Level Virtual Machine) 底层虚拟机

LLVM在Chris Lattner念博士时更加的成熟。首先,LLVM使用GCC作为前端来对用户程序进行语义分析产生 IF(Intermidiate Format),然后,LLVM使用分析结果完成代码优化和生成。这项研究让Chris Lattner在2005年毕业的时候,成为了小有名气的编译器专家

历史背景2

Clang历史

Apple吸收Chris Lattner的目的要比改进GCC代码优化宏大得多——GCC系统庞大而笨重,而Apple大量使用的Objective-C在GCC中优先级很低。此外GCC作为一个纯粹的编译系统,与IDE配合得很差。加之许可证方面的要求,Apple无法使用LLVM 继续改进GCC的代码质量。于是,Apple决定从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC

_config.yml

LLDB

除了LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB和一个C++的标准库libstdc++

_config.yml

LLDB调试器 命令行

官网: http://lldb.llvm.org/tutorial.html

Manual 手册

命令man

_config.yml

描述

lldb是lldb调试器库的命令行接口。lldb可以调试C、c++、Objective-C、objective - c++和Swift程序

下列选项可供选择:

-h, –help

-l, –script-language language

告诉调试器使用指定的脚本语言。用户定义的脚本,而不是默认的脚本。有效的脚本可以指定的语言包括Python、Perl、Ruby和Tcl。目前只实现了Python扩展

LLDB XCode 常用命令

1. 帮助命令 help 、apropos

help 显示所有调试器命令的列表,或给出指定命令的详细信息

apropos 列出与一个单词或主题相关的调试器命令

2.显示当前线程的调用堆栈 bt

3.断点br 及 流程控制

br 断点 continue/c 继续运行 step/s // thread step in next/n

4.求值命令 expression

expression 在当前线程上计算相应的表达式。显示任何返回值LLDB的默认格式。期望“原始”输入

在swift 文件 和 OC文件中 赋值语句稍有不同,swift 中用var 创建变量,变量前需要加上 $符号

渲染服务实际上是一个另外的进程 (被称作 backboardd)。这就是说即使我们正在调试的内容所在的进程被打断了,
backboardd 也还是继续运行着的
刷新UI:   e (void)[CATransaction flush]

5.打印变量/对象 p/po

p 打印对象类型、内存地址、对象的值等具体信息 po 打印对象调用description方法得到的值

指定格式打印:

  1. 以二进制打印 p/t … 2. 以八进制打印 p/x … 3. 以十六进制打印 p/x …

6.image 访问一个或多个目标模块的信息

比较实用的用法是用于寻找栈地址对应的代码位置, 定位错误(查找可执行文件或共享库的原始地址)

image lookup --address 0x0000000100004af8

查看工程中使用的库

image list

查看具体的类型

image lookup --type NSURL

LLDB XCode 常用命令

7.查看线程状态

检测进程的当前状态

thread list

获取线程的跟踪栈

thread backtrace    // thread backtrace all

查看调用栈状态,检查帧参数和本地变量

frame variable    // frame variable self

查看当前行数和源码文件以及其他一些信息

frame info

查看内存

x/4c $str

立即返回,跳出当前栈帧

thread return 函数需要的返回值

LLDB可以做的事和不可以做的事

不能创建新函数… 这意味着不能创建新的类,block,函数,有虚拟函数的 C++ 类等等。除此之外,它都可以做

LLDB插件Chisel

观察实例变量的变化 wivar

非重写方法的符号断点 bmessage

命令 描述
hide/show 隐藏 / 显示 view or layer
slowanim/unslowanim 减慢动画过程/取消减慢
border/unborder 为view或layer画边框,颜色和宽度可自定义/移除view或Layer的边框
alamborder/alamunborder 在有约束冲突的views显示边框/移除…
mask/unmask 在窗口中添加一个透明的矩形以显示复杂或隐藏的view或layer的边界 / 移除…
present/dismiss present一个控制器/Dismiss一个present的控制器
flicker 将指定view闪烁一下,以便找到view的位置
   
mwarning 模拟 一次内存警告
caflush 强制 Core Animation 刷新,效果是重绘UI,但是忽略动画效果
wivar 为对象的实例变量设置一个断点
pclass 打印一个对象的继承关系
pivar 打印一个对象的已命名实例变量的值
pproperties 打印一个实例或类的所有属性
pmethods 打印一个类的对象方法和类方法
pinternals 通过指向一个对象的指针来展示对象的内部状况
pinvocation 打印当前invocation的堆栈帧、接收者和参数.如果任何参数是可变的,将无法打印出所有的参数
presponder 从指定的响应者开始打印响应者链
ptv 在层次结构中打印最高的tableView
pvc 循环打印viewController的层级结构
pviews 循环打印view的层级结构
fv 根据类名搜索内存中与之匹配的view
fvc 根据类名搜索内存中与之匹配的控制器
   
pbundlepath 打印应用的bundle目录路径
pjson 将字典或数组按照JSON打印出来
pkp 用-valueForKeyPath:打印出key path表达式的值
poobjc 打印出表达式在ObjC++上下文的结果,是”expression -O -l ObjC++ – “的快捷方式
pdata 以字符串格式打印NSData对象的内容
   
setinput text field 或 text view是第一响应者时,输入相应的文本
settext 通过指定id在view上设置文本
   
binside 为当前运行的框架/库设置一个相对地址的断点
bmessage 为类上的选择器设置断点,即使该类未实现覆盖父类的选择器
   
pbcopy 打印对象并拷贝输出到剪贴板
pblock 打印block的实现地址和签名
   

更多相关指令的信息, 输入 help <command-name> 查看

引用源

排名不分先后

http://blog.chinaunix.net/uid-426110-id-2125627.html

https://yq.aliyun.com/articles/254333

https://blog.csdn.net/talentedlas/article/details/51945569

https://linuxtoy.org/archives/big-changes-llvm-clang-libcxx-lldb.html

https://www.oschina.net/p/llvm

https://www.ibm.com/developerworks/cn/opensource/os-cn-clang/index.html

http://www.cocoachina.com/ios/20150126/11021.html

http://www.cocoachina.com/ios/20141219/10709.html

https://www.jianshu.com/p/087cd19d49ba

https://www.thinksaas.cn/group/topic/595387/

Written on April 14, 2018