我们职责是开发iOS应用,我们要做的就是生产bug和解决bug,调试对于每一个开发人员来说都是亘古不变的操作。如何高效调试提高我们的装X技能了,所以掌握Xcode的LLDB最为重要。
LLDB
首先瞟一眼LLDB长啥样,如下图:
LLDB 是一个有着 REPL 的特性和 C++ 、Python 插件的开源调试器。
LLDB命令结构
<command> [<subcommand> [<subcommand>...]] <action> [-options [option-value]] [argument [argument...]]
其中:
- command、subcommand:LLDB调试命令的名称。命令和子命令按层级结构来排列:一个命令对象为跟随其的子命令对象创建一个上下文,子命令又为其子命令创建一个上下文,依此类推。
- action:命令操作,想在前面的命令序列的上下文中执行的一些操作。
- options:命令选项,行为修改器(action modifiers)。通常带有一些值。
- argument:命令参数,根据使用的命令的上下文来表示各种不同的东西。
- []:表示命令是可选的,可以有也可以没有。
比例 po isFinish, po就是命令操作(print -object 简写), isFinish就是命令参数
原始命令
原始命令会将命令后面所有东西当做参数处理,很多原始命令也可以带命令选项,但是需要加-命令选项 -- 命令参数
区分, 注意–后的空额
(lldb) expression -o -- aTureValue
true
// 错误示范
(lldb) expression -o --aTureValue
error: <EXPR>:3:3: error: consecutive statements on a line must be separated by ';'
-o --aTureValue
^
;
常用命令
命令 | 全命令 | 介绍 |
---|---|---|
help | - | 命令提示,会罗列所有命令,非常有用,所有命令忘记了。有它就可以找其他命令了 |
a | apropos | 命令辅助,apropos 关键字可以搜索出相关的命令 |
e、ex、exp … | expression | 调试时动态执行表达式,并将结果打印出来,比如值动态更改,UI更改 |
vo/po | -/print -object | 与expr类似,打印对象,会调用description方法, 推荐使用vo更快,信息更全 |
v/p | print(type)表达式, 简单打印推荐使用v | |
call | - | 调用方法 |
bt | thread backtrace | 打印调用堆栈, 查看当前堆栈方法调用非常有用 |
实例技巧
调试UI
如果在运行界面得时候,有时候需要小调界面,常常需要写代码,然后重新编译,走流程,如果界面逻辑很深则需要很多时间。其实在断点调试的时候就可以执行表达式,刷新界面。
关键代码
// 先执行修改表达式
expression XXX
// 最后刷新[一定要执行才有效果]
expression CATransaction.flush()
修改背景色为红色
修改前
修改后
Tips: 这个调试在viewDidAppear(比如在viewDidLoad断点执行改变UI)执行之前不会立即有效,其他大部分刷新立即有效。
参考
- iOS开发调试概览 - Kenshin cui
- Xcode 和 LLDB 高级调试教程:第 1 部分: 使用表达式进行动态值更改,操作属性
- Xcode 和 LLDB 高级调试教程:第 2 部分: 设置属性观察点,值改变的时候会断点提示
- Xcode 和 LLDB 高级调试教程:第 3 部分:设置符号断点进行调试
来源:CSDN
作者:code海
链接:https://blog.csdn.net/qq_14920635/article/details/104538650