如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导相关的知识,希望对你有一定的参考价值。

概览

Xcode 13 之前,我们在调试链式调用或多重闭包中的表达式时,总是无法在希望的位置插入断点。

如果小伙伴们不太明白我的意思,请看如下示例:

如上图所示,在对应行下断点只会中断在该行第一个表达式上,而无法中断更深层的表达式。我们只有不停地 step in/out 才可以勉强达到目的。

上面只是非常简单例子,在实际App复杂代码的调试中,我们绝不希望这样浪费时间。

幸运的是,从 Xcode 13 开始,Apple 为我们提供了新的列断点(Column Breakpoints)机制,让我们可以在代码行的任意位置放置断点。

下面我们就一起来看看如何操作吧!😉


调试链式调用表达式

首先,我们搭建简单的测试环境代码:

import Foundation

class Panda 
    func eat() 
        print("Panda eat 🎋")
    
    
    private func deepMind(_ i: Int) -> Int 
        i % 2 == 0 ? i : i + 10000
    
    
    // 熊猫也要思考
    func thinking() 
        let max = Int.random(in: 200...500)
        // 如何中断在下面的 deepMind(_) 方法上
        let total = (1..<max).map $0 * 2.reduce(0)$0 + deepMind($1)
        print("total is \\(total)")
    


class Feeder 
    
    private let panda: Panda
    
    init(panda: Panda) 
        self.panda = panda
    
    
    // 返回饲养员喂养的熊猫
    func feeding() -> Panda 
        panda
    

接着,我们来看一下如何直接中断在链式调用尾部的 eat() 方法上:

let panda = Panda()
let feeder = Feeder(panda: panda)
feeder.feeding().eat()      // 如何中断在 eat() 方法上?
panda.thinking()

选中 eat() 方法,鼠标右键呼出上下文菜单,选择其中的 Create Column Breakpoint 子项:

OK!我们已经在 eat() 方法上创建了列断点:

运行App,现在 Xcode 调试器会精确中断在 eat() 方法而不是前面的 feeding() 方法上了!

对于任意深度链式调用中的每个表达式,我们都可以为其设置列断点,可谓非常方便。

调试多重闭包中的表达式

与链式调用相似,列断点也非常适合调试多重闭包中的表达式。

在实际App中,有很大概率我们会遇到如下代码:

func thinking() 
    let max = Int.random(in: 200...500)
    // 如何中断在下面的 deepMind(_) 方法上
    let total = (1..<max).map $0 * 2.reduce(0)$0 + deepMind($1)
    print("total is \\(total)")

以往来说,我们很难直接中断在 deepMind() 方法上,不过有了列断点后这就是小菜一碟的事了。

选中 deepMind() 方法,鼠标右键呼出上下文菜单,选择 Create Column Breakpoint 子项, deepMind() 上的列断点就新鲜出炉了!

注意,和其他类型断点类似,我们同样可以点击列断点进行编辑、禁用或删除:

现在执行代码,我们可以妥妥的直接命中 deepMind() 方法了,棒棒哒💯!!!

总结

在本篇博文中,我们介绍了 Xcode 13 新推出的列断点(Column Breakpoints),并演示了如何使用列断点让中断位置更加精确。

感谢观赏,再会!

以上是关于如何使用 Xcode 13+ 新的列断点(Column Breakpoints)让中断位置更加精确制导的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xcode 断点不起作用?

如何通过 LLDB 命令行添加断点操作?

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

SwiftUI项目如何在Xcode预览(Preview)中开启调试支持

使用新的 Xcode13+ 编译和运行我的 tvOS 项目,标签栏随 scrollView 滚动,我无法访问拆分视图控制器

在 XCode 中调试 - 通过代码和断点运行 [关闭]