• 如何使用 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
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

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

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

    选中 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)")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

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

    注意,和其他类型断点类似,我们同样可以点击列断点进行编辑、禁用或删除:
    在这里插入图片描述

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

    总结

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

    感谢观赏,再会!

  • 相关阅读:
    2.1 CSS 简介特性
    uniapp之uni-starter小程序多端研发框架搭建与项目实践
    Ubuntu离线或在线安装Python解释器
    k8s-资源调度-Taint & Toleration
    C# BinaryFormatter序列化后的文件格式
    吃柿子的禁忌靠谱吗?
    浅谈Label Smoothing技术
    同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
    2022年最新最详细IDEA关联数据库方式、在IDEA中进行数据库的可视化操作(包含图解过程)
    芯无界,才未来 “科创中国”第二届汽车芯片百人论坛在嘉定成功举办
  • 原文地址:https://blog.csdn.net/mydo/article/details/127699807