“若是调试是删除 bug 的过程,那么编程就是引入 bug 的过程。”(Edsger W. Dijkstra)html
对于苹果开发者而言,LLDB 是无人不知的调试工具,然而此知非彼知,相信有至关规模的开发者对 LLDB 的了解仍然停留于几个基础命令的使用,今天让咱们来从新认识一下既熟悉又陌生的 LLDB,看看它那些你未曾用过的强大功能,以及如何提升咱们的开发效率。git
开始把玩其功能以前,先搞清楚 LLDB 是什么,简言之,LLDB 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。github
LLDB is a next generation, high-performance debugger. It is built as a set of reusable components which highly leverage existing libraries in the larger LLVM Project, such as the Clang expression parser and LLVM disassembler.
LLDB is the default debugger in Xcode on Mac OS X and supports debugging C, Objective-C and C++ on the desktop and iOS devices and simulator.express
以上摘自官方文档中的一段简短的介绍,更多相关信息请参阅 LLDB 官方文档。编程
知道了 LLDB 是什么,还要了解其命令结构及语法,这样才能告别死记命令,开启压榨 LLDB 之路了。LLDB 通用结构的形式以下:sass
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
函数
其中:工具
举个例子:学习
命令:breakpoint set -n main
对应到上面的语法就是:ui
关于原始命令:
LLDB支持不带命令选项的原始命令,原始命令会将命令后面的全部东西当作参数(arguement)处理。但不少原始命令也能够带命令选项,当你使用命令选项的时候,须要在命令选项后面加 --
区分命令选项和参数。
如:expression
(就是 p
/print
/call
)、expression -o
(就是 po
),打印一个UIView
对象地址:
当咱们并不能彻底记得某个命令的时候,使用 apropos 经过命令中的某个关键字就能够找到全部相关的命令信息。 好比: 咱们想使用stop-hook的命令,可是已经不记得stop-hook命令是啥样了:
关于断点设置,多数人都习惯用图形界面去作,但在调试中有些场景仅仅靠图形界面仍是不够的,好比:如何经过断点实现相似 KVO 那样对成员变量变化的监听呢?(别跟我说你要加代码重写set方法...即便这样也不靠谱)。下面一一罗列那些好用的断点命令:
这两幅图你必定不陌生:
其余命令:
这些命令在逆向及定位错误时使用频率很是高。
.lldbinit
文件 & 插件安装前面所列的命令在 这里 都能找到官方说明,更多命令用法有兴趣的建议本身去细细探索,接下来咱们将站在巨人的肩膀上,用高手们专门为 LLDB 写的插件去深刻挖掘它的潜力。
推荐插件一: facebook 开源的 LLDB 插件 chisel
brew install chisel
的安装过程这里就不赘述了,安装成功后,在~/目录下的 .lldbinit
文件中引入对应文件路径,增长一行:command script import /usr/local/opt/chisel/libexec/fblldb.py
后保存, 重启 Xcode便可使用。它提供的快捷 命令清单及说明 这里也不赘述了。截个图感觉下它的强大吧:
推荐插件二:DerekSelander/LLDB
该插件与 chisel 都是用 Python 写的,其安装须要手动下载仓库,而后将仓库中 dslldb.py
文件的路径用与上述一样的方式添加到 .lldbinit
中,具体用法也很简单粗暴,就不在这粘贴了,请至 README 领略。
看到这,你收获的只有暂时记忆,其实等于毫无所获...并且还浪费了宝贵的几分钟,这也是我极不但愿看到的,而避免其成为事实的惟一方式就是,请你打开 Xcode,运行一个项目,参照着文中涉及到的说明文档,试着敲一敲每一个命令,体会一下它们的用法与区别。最后,为你的 LLDB 配好插件,去感觉它的蜕变,相信我,你的开发效率提高的可不止一点点。学习是一种能力,拒绝操做手册式灌输,分享者多半是在总结学习收获时为读者提供一些思路或方向,这也是我为你保留一丝探索余地的初衷,愿你有所收获。
水平有限,请大神多多指正。下篇再会~