LLDB
我们通常都是在Xcode中对我们的项目进行打断点调试的时候所用的调试器就是lldb。相信大部分人对lldb的使用的比较多的就是使用“po”打印某个变量的描述(description or debugDescription)。但其实LLDB能够做到的不仅仅只是这个。
打开终端,输入lldb之后,再输入help,你会发现一下子列出了几十行关于lldb的命令跟相对应的注释。
从常用的命令po开始了解lldb,po其实 是 expression -O的简写,其作用是打印一个对象的描述,,若有重写dubugDescription或description则打印其重写的内容,否则是打印其地址。(打印的内容优先级是:debugDescription > description > 地址)。
这个expression代表什么意思,-O又是代表什么意思。在终端的lldb上输入help expression,你可以看到所有关于expression的说明文档。图1为截取的部分。
这边对expression的解释大概意思就是在当前线程解析某表达式然后展示该表达式返回的值,后面的则是对expression的设置,或者理解成展示的规则。这里我们可以看到 -O 就是代表展示description。
接下来我们要用expression来做件有意思的东西,在lldb调试过程中创建本地变量。贴上代码!(图2)
在创建本地变量的时候需要加上$这个符号,在使用它的时候也需要带上$,这是lldb的一个语法要求。通过这样简单的几句就能够添加本地变量。那这个东西在我们日常的开发调试过程中有怎样的实际意义呢?试想一下,当你对某个功能模块进行测试的时候,针对不同的输入会有不一样的输出,以往可能我们需要对每种情况重复地去跑程序测试,但有了这个方法,我们可以在被测试的模块入口动态生成不同类型的输入,直接查看对应的输出结果,这可以在某种程度上节约开发时间,提高开发效率。
接下来做另外一件有意思的东西,动态修改当前线程中的变量属性。
打开Xcode新建一个项目,然后在viewDidLoad处打上断点,接着Run。(图3)
我们现在打算做的就是将当前的viewController的背景色从默认的白色改为红色,接下来我们在下方lldb里输入以下代码(图4)
这里的代码其实做的东西就是创建一个本地变量指向当前viewController的地址,然后修改其背景色,点击运行,就能发现原来的viewController的背景色变成了红色。实际上只要我们拿到了当前的viewController的地址之后,我们通过expression UIViewController * $vc = (UIViewController *)0x7fc7f5605810 在任何地方使用该viewController(即便不在当前线程内)
在使用expression指令的时候还有个“-l”的参数也会比较常用,这个是设置expression后续的表达式是用什么语言。"-l objc"代表使用OC, “-l swift”代表使用swift。在调试由swift编写的项目时,lldb默认是使用swift,OC项目则是使用oc,如果想在指定项目使用另一种语言在lldb调试的,在expression指令后加上“-l objc(swift)”。
关于expression还有很多用法,这里就不一一列举,了解它最好的方式就是通过在lldb输入help获取到其说明文档,然后按照文档的用法去尝试每个指令的作用。