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
指令
- 输入
help <command-name>
会打印特定指令的相关说明
2.2 print、printobject 、call指令
2.2.1 print指令
-
print
指令(可简写为p
)为打印基本信息打印基本类型的值,或者打印对象的类型和指针.
2.2.2 printobject指令
-
printobject
(可简写为po
)为打印对象信息的指令,即调用对象的description
方法,和NSLog作用相同
2.2.3 call指令
- call指令可以执行一行代码但不会处理其返回值:如下图所示
redView
的backgroundColor
设置错误了,我们可以通过call指令修改过来
- 总结:三种指令均可执行指令附带的代码,尽在返回结果上的处理不同.
p
指令打印返回值的基本信息,po
指令打印返回值的description
,call
指令不打印返回值.绝大多数情况下用po
指令即可.
2.3 thred指令
- 如图所示代码将断点打在37行
-
控制台结果如下,左侧的
var展示区
则显示了当前作用域的变量
-
此时如果我想获取
p_do1
中的变量值改怎么做?- 输入指令thread backtrace 获取堆栈信息:当前栈为frame #0,
p_do1
栈为frame #1;
- 输入指令thread backtrace 获取堆栈信息:当前栈为frame #0,
- 输入
frame select 1
指令进入p_do1
的栈内,左侧变显示其作用域内的变量信息.
2.4 return指令
Debug的时候,也许会因为各种原因,我们不想让代码执行某个方法,或者要直接返回一个想要的值。这时候就该
thread return
上场了。
thread return可以接受一个表达式,调用命令之后直接从当前的frame返回表达式的值。-
如下图此代码在控制台的打印结果应该是
25963
但是在断点处输入
thread return 1024
打印结果结变为1024