探索断点改进
列断点
我们在设置断点的时候,通常都是在某行的开头打上断点标记。但是随着swift的发展,尾随闭包、计算属性、$0这种默认参数名称等等,让我们可以在一行中很简洁的表达意图。但是,我们在这一行打上断点的时候,编译器会为我们生成多个可供lldb中断的位置。举个例子:
class ViewController: UIViewController {
var ajustDensity: Bool {
return true
}
func convertedToVolume(ajustDensity: Bool) -> Int {
return ajustDensity ? 100 : 10
}
override func viewDidLoad() {
super.viewDidLoad()
// 在下面这一行打上断点,step会进入到计算属性ajustDensity中
let result = self.convertedToVolume(ajustDensity: self.ajustDensity)
print(result)
}
}
xcode13提供了更精细的断点控制:列断点
。比如上面的代码,我们只想在convertedToVolume
方法上打断点,不想进入ajustDensity
计算属性中。
此时可以移到对应函数上,鼠标右键单击,选择create column breakpoint
。
打上列断点后就会出现一个小箭头,我们单击小箭头就能出现断点设置相关界面,可以编辑、移除。
同时,当进入断点时,对应位置会用绿色的下划线
进行标记,表明当前断点的位置。
再来看个swift闭包的例子:
let array = [1,2,3,4,5]
let result = array.map{ "\($0)" }.map{ "\($0)\($0)" }
print(result)
我们只想在第二个map中打下断点,查看$0的值,所以我们可以在第二个map中的$0上打上列断点。
符号断点
class ViewController: UIViewController {
func toggle() -> Bool {
return true
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
var a = true
a.toggle()
let result = self.toggle()
print(result)
}
}
我们添加一个symble包含toggle
的Symbolic Breakpoint
。
他会匹配系统库在内的所有符合的符号。如果没有限制,可能会命中非常多的位置。还好我们可以将搜索结果限制在某个module中。
现在就只有viewcontroller中的toggle会进入断点。
如果我们创建了一个找不到的symblic breakpoint
,xcode会显示一个虚线断点
。
这是xcode13的新功能,如果某个断点没有被lldb解析出是在哪个位置,就会显示一个虚线断点。虚线断点出现的原因可能有无数个,不过我们都可以鼠标悬停在虚线断点上面,xcode会显示一个原因弹窗。
上面显示了可能原因:
- 检测拼写错误
- 符号是否存在
- Library是否loaded
我们也可以在lldb中去搜索符号:
(lldb) image lookup -rn toggle SwiftDemo
1 match found in /Users/gx/Library/Developer/Xcode/DerivedData/SwiftDemo-bjjbgmlihoaimlfphiakxpgactle/Build/Products/Debug-iphonesimulator/SwiftDemo.app/SwiftDemo:
Address: SwiftDemo[0x0000000100002e50] (SwiftDemo.__TEXT.__text + 0)
Summary: SwiftDemo`SwiftDemo.ViewController.toggle() -> Swift.Bool at ViewController.swift:12
虚线断点
还有可能出现在source file breakpoint
中。同样的我们悬停在上面,可以看到通常的原因:
- 这一行没被编译,比如:
#if
限制等 - Build setting中是否设置了生成调试信息
- 。。。
Runtime Issues Breakpoint
这会在我们遇到Runtime问题时进入断点。注意后面的描述to hit the breakpoint ...
,我们还需要进入diagnostic中进行设置,我们可以点那个小箭头快速进入设置界面。