0. 为什么写LLDB的文章
- 我看的有的同事在开发的时候:临时想看一个变量的值,就在对应代码行写上一个
Log>>编译>>运行>>到指定页面>>观察控制台.看到这里请反省一下自己是否现在还在用这种令人窒息的操作?如果是,那么这篇文章对你很重要请务必认真阅读;
1.LLDB简介
*LLDB是XCode5之后自带的debugger.
*LLDB的homepageLLDB,有兴趣可以去自行了解.
- 其实你在之前就已经接触并使用到了
LLDB,如下图中所示堆栈区、var展示区、控制台、和toolbar均为LLDB的操作区域.其中除了控制台以外其余的3个区域为XCode对LLDB的可视化展示.(即其余3个区域的功能都在控制台中得到实现)
2. LLDB指令
-
Xcode进入断点或Crash时都会进入LLDB,此处的LLDB及表示已经进入LLDB并可输入LLDB指令.
2.1 help指令
- 直接输入
help指令会打印出所有的LLDB指令
image.png
- 输入
help <command-name>会打印特定指令的相关说明
image.png
2.2 print、printobject 、call指令
2.2.1 print指令
-
print指令(可简写为p)为打印基本信息打印基本类型的值,或者打印对象的类型和指针.
image.png
2.2.2 printobject指令
-
printobject(可简写为po)为打印对象信息的指令,即调用对象的description方法,和NSLog作用相同
image.png
2.2.3 call指令
- call指令可以执行一行代码但不会处理其返回值:如下图所示
redView的backgroundColor设置错误了,我们可以通过call指令修改过来
- 总结:三种指令均可执行指令附带的代码,尽在返回结果上的处理不同.
p指令打印返回值的基本信息,po指令打印返回值的description,call指令不打印返回值.绝大多数情况下用po指令即可.
2.3 thred指令
- 如图所示代码将断点打在37行
image.png
-
控制台结果如下,左侧的
var展示区则显示了当前作用域的变量
image.png
-
此时如果我想获取
p_do1中的变量值改怎么做?- 输入指令thread backtrace 获取堆栈信息:当前栈为frame #0,
p_do1栈为frame #1;
- 输入指令thread backtrace 获取堆栈信息:当前栈为frame #0,
image.png
- 输入
frame select 1指令进入p_do1的栈内,左侧变显示其作用域内的变量信息.
image.png
2.4 return指令
-
Debug的时候,也许会因为各种原因,我们不想让代码执行某个方法,或者要直接返回一个想要的值。这时候就该
thread return上场了。
thread return可以接受一个表达式,调用命令之后直接从当前的frame返回表达式的值。 -
如下图此代码在控制台的打印结果应该是
25963
image.png
-
但是在断点处输入
thread return 1024打印结果结变为1024
image.png














网友评论