关注我们,get更多iOS技能
调试程序是了解应用程序意外行为的重要过程。作为一名iOS开发者,必须要了解如何使用断点来调试程序,从而减少修复错误所花费的时间。但有时,一个简单的断点往往是不够的。这篇文章将会和大家介绍通用断点的使用,以及一些高级选项,和在使用断点过程中的一些Tips。
Xcode不知识提供在指定行添加断点,你也可以使用一些通用的断点用于整个项目。可以通过xcode菜单“视图->导航器->显示断点导航器”进入断点导航器。
点击这个视图的底部的+按钮,用来添加通用断点:
Swift Error Breakpoint
我们可以使用这个断点在程序抛出异常时暂停执行。先看一个例子:
enum IteratorErrors: Error {
case notEnoughOddNumbers
case notEnoughEvenNumbers
}
final class Iterator {
private var oddNumbersCount = 0
private var evenNumbersCount = 0
init() {
do {
try iterateArray()
} catch {}
}
func iterateArray() throws {
[ 1, 2, 3, 4, 5, 6, 7, 8 ].forEach { (number) in
if (number % 2 == 0) {
evenNumbersCount += 1
} else {
oddNumbersCount += 1
}
}
if oddNumbersCount < 100 {
throw IteratorErrors.notEnoughOddNumbers
}
if evenNumbersCount < 100 {
throw IteratorErrors.notEnoughEvenNumbers
}
}
}
如果添加Swift Error Breakpoint,程序会在抛出异常的地方暂停,这样我们可以定位到异常发生的地方,以及查看堆栈信息。
Exception Breakpoint
在iOS开发过程中,有时会出现崩溃,调试器没有提供关于它的很多信息,无法定位到问题所在。这时,如果激活此断点,程序就会停在crash发生的地方。
这个断点对于捕获程序中的崩溃非常有用,我们要一直开启它。
Symbolic Breakpoint
如果想要在调用指定方法时暂停,这个断点非常有用。可以输入任意的方法或函数,使用方法如下:
当调用方法iteratearray时,程序会暂停。
Test Failure Breakpoint
这个断点是可以让程序在失败的测试中暂停测试。这样,我们就可以看出哪一个失败了。非常直截了当。
高级选项
我们使用右键单击指定断点,并单击“编辑断点”来编辑断点。
Condition
使用这个选项,我们可以决定调试器何时暂停我们的应用程序。如:
Action
action是指断点满足其条件时发生的行为。通过点击add action来添加一个action,可以添加多个action。
Debugger Command
可以在调试控制台执行LLDB指令,如po:
在控制台会输出:
"hello!"
Log Message
通过这个选项,我们可以自定义在控制台打印的日志。如果要使用变量的值,可以通过@variable_name@这种方式来使用。
控制台就会打印:
the number value is 3
Shell Command
加载指定路径下的shell脚本,执行特定指令。
- 定义一个shell脚本,存储在指定路径下。
#!/bin/bash
echo "The number is $1"
- 在断点编辑器中指定脚本路径和参数值
控制台会输出:
通常应启用“Wait until done”以避免脚本出现错误。 **注意:**检查脚本权限,避免出现由于权限问题而引起的脚本运行失败。
AppleScript
通过AppleScript语法指定要执行的操作,与shell脚本不同的是,这里直接使用代码而非脚本路径。
Sound
这个操作非常简单,它允许我们在调试器因断点而暂停时播放声音。它提供一个组合框来选择不同类型的声音。
Continue After Evaluating
最后一个可用的选项是“Continue After Evaluating”。启用此选项后,断点不会暂停执行。与操作结合使用时很有用,因为我们很可能会有一些不应暂停应用程序执行的操作。
Tips
1、使用调试断点代替Print。
可以使用Log Message选项打印指定内容,这样可以去除调试日志,使代码更干净。
2、将一些常用断点,定义为用户断点,这将使断点在打开的每个xcode项目中都可用。
User下面下会显示所有用户断点:
3、通过git共享断点。
有时在查看同事的工作流程时,你会发现他有一些很好且有用的定义断点。与其问他设置相同断点的指令,不如让他通过git共享。