LLDB介绍
主要介绍一下LLDB常用命令,及其插件chisel的使用
编译器背景知识
1. 编译器的前端与后端之分
根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。
前端
主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间表示生成。
后端
主要指与目标机有关的部分,包括代码优化和目标代码生成等
2. llvm_arc图
历史背景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 克里斯·拉特纳
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
LLDB
除了LLVM核心和Clang以外,LLVM还包括一些重要的子项目,比如一个原生支持调试多线程程序的调试器LLDB和一个C++的标准库libstdc++
LLDB调试器 命令行
官网: http://lldb.llvm.org/tutorial.html
Manual 手册
命令man
描述
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方法得到的值
指定格式打印:
- 以二进制打印 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/