LLDB 命令和调试(一)
为什么要学习 LLDB 调试
对于我们程序员来说,构建调试几乎是每天必做的工作。 你是否遇到过下列情况?
- 想打印对象的 description 来追踪对象.
- 调试界面的时候想改变某个 view 的颜色以便查看界面布局.
- 有些代码在某些特定条件下才能满足,但程序运行时未必达到这个条件.
此时我们一般会默默的按下 Command + .
, 增加一段代码, NSLog(...) , view.backgroundColor = [UIColor redColor] 等等,再次按下 Command + r
查看运行状态, 运气好我们能顺利的达到目的,运气不好就要重复这个步骤几次,而且调试之后还要默默删掉。一天下来腰酸背痛手抽筋... , 来放弃这种重复的重体力劳动吧, 我们来学一个新技能 LLDB 调试
,学会它之后你就像会了左右互搏, 双剑合璧, 九阴真经, 玉女素心剑法... 咳咳 , 扯远了我们言归正传。
什么是LLDB
官方说明 http://lldb.llvm.org/index.html
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.
....
Wikipedia https://en.wikipedia.org/wiki/LLDB_(debugger)
Current state
Although LLDB is in early development, it is mature enough to support basic debugging of programs writtenten in C, Objective-C, C++ and Swift.
LLDB is known to work on OS X, Linux, FreeBSD, and Windows[2] and supports i386, x86-64 and ARM instruction sets.[3] It is used as a default debugger for Xcode 4.3 and later versions
由以上资料可知,LLDB 是下一代高性能的调试器,现在已经支持在多个平台运行,支持 C, C++, Objective-C,Swift。从 LLVM 编译器语言无关的特性来看,以后有可能会支持更多的语言。
Xcode 从4.3版本开始就集成该调试器了,现在更是变成了默认选项。可以简单的认为 LLDB 的调试命令是 Xcode 可视化调试的底层支撑,所以这样类似九阴真经的东西,我们还是有必要了解一下的。
Preview
首先让我们先预览以下我们学完之后可以做什么,例如我们有下面这样一个例子:当按钮按下时,随机生成r、g、b 值, 当 r 为奇数的时候生成 view,并使用 r,g,b 的值设置了一个 view 的 frame, 并在每次点击的时候都更改 view 的 tintColor 属性。
现有如下需求,我们需要在调试的时候知道:
- 按钮按下几次的时候创建了 view
- 被我们创建的 view 有多大
- 当前 view.tintColor 值是多少
这时候我们只要在如图位置打两个断点
按下 Command + E + LeftClick
对断点进行如下编辑
Command + R
运行,按几次按钮来触发断点,我们能看到 Output窗口正输出按下的次数,第一个断点并不触发,当 maskView 创建成功时第二个断点被触发,此时 Output 输出了按下次数 $runnumber, frame, tintColor。
(int) $0 = 0
(int) $runnumber = 1
maskView frame is {{0, 197}, {116, 72}}, tint color is UIDeviceRGBColorSpace 0.772549 0.454902 0.282353 1
至此调试结束,是不是感觉很简单,但如果我们不用 LLDB 命令调试,我们至少要进行以下几个步骤:
- 要在全局声明一个变量来记录按下次数。
- 由于 tintColor 属性变量在调试窗口不可见,要添加一个 NSLog 打印 tintColor 的值。
- 调试之后我们要删除添加添加代码。
而使用 LLDB 命令与 Xcode 可视化共同协作之后,调试变的很灵活,我们可以
- 使用 Condition 中修改触发条件
- 使用 Ingore 来调整断点忽略次数
- 使用 Action 添加命令,进行变量的声明,计算,输出等。
- 使用 添加编辑断点的方法,替代添加、编辑测试代码。
- 使用 禁用、删除断点的方法代替,删除测试代码,有效防止脏代码的发生。
怎么样心动了没,从下一节开始,让我们一起来学习 LLDB 调试命令吧~