序:原文 Dancing in the Debugger — A Waltz with LLDB
声明:译文有一部分参考自:与调试器共舞 - LLDB 的华尔兹
续...(接上一篇)
流程控制
打断点的方法(此处不翻译)
调试工具条:
![](https://img.haomeiwen.com/i1291197/5d728e5bb366a98c.png)
![编辑符号断点](https://www.objc.io/images/issue-19/Image_2014-11-22_at_11.54.44_AM-17f46197.png)
这时会出现一个弹出框,你可以在里面添加例如
-[NSArray objectAtIndex:]
这样的符号断点。这样
每次
调用这个函数的时候,程序都会停止,不管是你调用还是苹果调用。
如果你 Xcode 的 UI 上右击任意
断点,然后选择 "Edit Breakpoint"
的话,会有一些非常诱人的选择。
![](https://www.objc.io/images/issue-19/Image_2014-11-22_at_11.58.06_AM-c9fbc11f.png)
这里,断点已经被修改为只有当
i是99
的时候才会停止。你也可以使用"ignore"
选项来告诉断点最初的n
次调用 (并且条件为真的时候) 的时候不要停止。
接下来介绍 'Add Action' 按钮...
断点行为 (Action)
上面的例子中,你或许想知道每一次到达断点的时候 i 的值。我们可以使用 p i 作为断点行为。这样每次到达断点的时候,都会自动运行这个命令。
![](https://www.objc.io/images/issue-19/Screen_Shot_2014-11-22_at_12.01.32_PM-cfa40284.png)
也可以添加多个行为,可以是调试器命令,shell 命令,也可以是更直接的打印:
![](https://www.objc.io/images/issue-19/Image_2014-11-22_at_12.06.34_PM-fcedf7b6.png)
可以看到它打印
i
,然后大声念出那个句子,接着打印了自定义的表达式。
下面是在 LLDB 做这些的时候:
(lldb) breakpoint set -F isEven
Breakpoint 1: where = DebuggerDance`isEven + 16 at main.m:4, address = 0x00000001083b5d00
(lldb) breakpoint modify -c 'i == 99' 1
(lldb) breakpoint command add 1
Enter your debugger command(s). Type 'DONE' to end.
> p i
> DONE
(lldb) br li 1
1: name = 'isEven', locations = 1, resolved = 1, hit count = 0
Breakpoint commands:
p i
Condition: i == 99
1.1: where = DebuggerDance`isEven + 16 at main.m:4, address = 0x00000001083b5d00, resolved, hit count = 0
接下来说说自动化。
赋值后继续运行
看编辑断点弹出窗口的底部,你还会看到一个选项:*"Automatically continue after evaluation actions."*
。它仅仅是一个选择框,但是却很强大。选中它,调试器会运行你所有的命令,然后继续运行。看起来就像没有执行任何断点一样 (除非断点太多,运行需要一段时间,拖慢了你的程序)。
这个选项框的效果和让最后断点的最后一个行为是continue
一样。选框只是让这个操作变得更简单。调试器的输出是:
(lldb) breakpoint set -F isEven
Breakpoint 1: where = DebuggerDance`isEven + 16 at main.m:4, address = 0x00000001083b5d00
(lldb) breakpoint command add 1
Enter your debugger command(s). Type 'DONE' to end.
> continue
> DONE
(lldb) br li 1
1: name = 'isEven', locations = 1, resolved = 1, hit count = 0
Breakpoint commands:
continue
1.1: where = DebuggerDance`isEven + 16 at main.m:4, address = 0x00000001083b5d00, resolved, hit count = 0
执行断点后自动继续运行,允许你完全通过断点来修改程序!你可以在某一行停止,运行一个 expression
命令来改变变量,然后继续运行。
#######示例
想想所谓的"打印调试"技术吧,不要这么做:
NSLog(@"%@", whatIsInsideThisThing);
而是用个打印变量的断点替换 log 语句,然后继续运行。
也不要:
int calculateTheTrickyValue {
return 9;
/*
Figure this out later.
...
}
而是加一个使用 thread return 9
命令的断点,然后让它继续运行。
符号断点加上 action 真的很强大。你也可以在你朋友的 Xcode 工程上添加一些断点,并且加上大声朗读某些东西的 action。看看他们要花多久才能弄明白发生了什么。装逼必备神器😄
完全在调试器内运行
此部分感觉无用不翻译
未完待续...
移步 和 LLDB 调试器来一场说跳就跳的华尔兹(三)
喔
接下来才是 LLDB 在项目中的实际使用场景,不容错过喔
网友评论