Chisel是一个加强LLDB调试能力的小插件.主要特点在于辅助界面开发调试时在控制台以尽可能直观的方式查看界面的元素和情况.为我们梳理视图,控制器以及类关系层级.以及一些临时的界面调试变动进行快捷响应.它的作者来自于Facebook团队.得益于开源,让我们来观摩和了解一下这个东东到底有什么用处. 它是一个开源的 LLDB 插件合辑,这会使调试变得更加有趣。
LLDB
LLDB 是一个有着 REPL 的特性和 C++ ,Python 插件的 开源 调试器。
你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值?
NSLog(@"%@", whatIsInsideThisThing);
或者跳过一个函数调用来简化程序的行为?
NSNumber *n = @7; // 实际应该调用这个函数:Foo();
或者短路一个逻辑检查?
if (1 || theBooleanAtStake) { ... }
或者伪造一个函数实现?
int calculateTheTrickyValue { return 9; /* 先这么着 ... }
并且每次必须重新编译,从头开始?
构建软件是复杂的,并且 Bug 总会出现。一个常见的修复周期就是修改代码,编译,重新运行,并且祈祷出现最好的结果。
但是不一定要这么做。你可以使用调试器。而且即使你已经知道如何使用调试器检查变量,它可以做的还有很多。
这篇文章将试图挑战你对调试的认知,并详细地解释一些你可能还不了解的基本原理,然后展示一系列有趣的例子。现在就让我们开始与调试器共舞一曲华尔兹,看看最后能达到怎样的高度。
LLDB 和 Python
LLDB 有内建的,完整的 Python 支持。在LLDB中输入 script,会打开一个 Python REPL。你也可以输入一行 python 语句作为 script 命令 的参数,这可以运行 python 语句而不进入REPL:
(lldb) script import os (lldb) script os.system("open http://www.objc.io/")
这样就允许你创造各种酷的命令。把下面的语句放到文件 ~/myCommands.py 中:
def caflushCommand(debugger, command, result, internal_dict): debugger.HandleCommand("e (void)[CATransaction flush]")
然后再 LLDB 中运行:
command script import ~/myCommands.py
或者把这行命令放在 /.lldbinit 里,这样每次进入 LLDB 时都会自动运行。Chisel 其实就是一个 Python 脚本的集合,这些脚本拼接 (命令) 字符串 ,然后让 LLDB 执行。很简单,不是吗?
紧握调试器这一武器
LLDB 可以做的事情很多。大多数人习惯于使用 p,po,n,s 和 c,但实际上除此之外,LLDB 可以做的还有很多。掌握所有的命令 (实际上并不是很多),会让你在揭示代码运行时的运行状态,寻找 bug,强制执行特定的运行路径时获得更大的能力。你甚至可以构建简单的交互原型 - 比如要是现在以 modal 方式弹出一个 View Controller 会怎么样?使用调试器,一试便知。
这篇文章是为了想你展示 LLDB 的强大之处,并且鼓励你多去探索在控制台输入命令。
打开 LLDB,输入 help,看一看列举的命令。你尝试过多少?用了多少?
但愿 NSLog 看起来不再那么吸引你去用,每次编辑再运行并不有趣而且耗时。