写在前言
昨天请教一个同为iOS开发的朋友关于拦截WKWebview长按事件的事,可惜并没有解决,但却让我接触到了LLDB的使用,瞬间感觉一年多的iOS开发白做了。。。刚好最近刚把写文章的习惯养成,故把lldb一些信息记录下来。<p>----摘自各种文章
快捷键
先记忆一下一小部分快捷键,毕竟老是用鼠标点来点去的容易抽筋。。。
| 快捷键功能 | 命令 |
| -------------- |: --------- :|
| 暂停/继续 | cmd+c |
| 控制台显示/隐藏 | cmd+y |
| 光标切换到控制台 | cmd+shift+c |
| 清空控制台 | cmd+k |
| step over | F6 |
| step into | F7 |
| step out | F8 |
HELP
如果不知道命令的含义,可以在控制台输入help来查看具体命令含义与参数。
8E5E26BB-EB01-4F48-AB59-371C69BF60CF.png
最简单的命令, 例如:print self.view或p.self.view
其中的$1其实是指向这个打印结果的,任何以美元符开头的东西都是存在于 LLDB 的命名空间的,它们是为了帮助你进行调试而存在的,如下图
38719C79-6B61-44FB-9061-AC474DF6FD5F.png
expression
如果想改变程序中的一个值,使用expression:
DA5C7339-615B-45C1-9510-B5B6A7153108.png流程控制
Image_2014-11-22_at_10.37.45_AM.png从左到右,四个按钮分别是:continue,step over,step into,step out。
第一个,continue按钮,会取消程序的暂停,允许程序正常执行,要么一直执行下去,要么到达下一个断点。在LLDB中,我们可以用
process continue
命令来达到同样的效果,它的别名是continue
,也可以缩写为c
。<p>
第二个,step over 按钮,会以黑盒的方式执行一行代码。如果所在这行代码是一个函数调用,那么就不会跳进这个函数,而是执行这个函数,然后继续。LLDB则可以使用thread step-over,next
,或者n
命令。<p>
如果确实想跳进一个函数调用来调试或者检查程序的执行情况,那就用第三个按钮,stepin,或者在LLDB中使用thread step in
,step
,或者s
命令。注意,当前行不是函数调用时,next
和step
效果是一样的。<p>
大多数人知道c
,n
和s
,但是其实还有第四个按钮,step out。如果你曾经不小心跳进一个函数,但实际上你想跳过它,常见的反应是重复的运行n
直到函数返回。其实这种情况,step out 按钮是你的救世主。它会继续执行到下一个返回语句 (直到一个堆栈帧结束) 然后再次停止。
Thread Return
调试时,还有一个很棒的函数可以用来控制程序流程:thread return
。它有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧。这意味这函数剩余的部分不会被执行。这会给 ARC 的引用计数造成一些问题,或者会使函数内的清理部分失效。但是在函数的开头执行这个命令,是个非常好的隔离这个函数,伪造返回值的方式 。
结束
先写这么多,主要是摘抄的,目的是自己做一个记录,这是原文地址:与调试器共舞 - LLDB 的华尔兹
网友评论