Discover breakpoint improvements
Developer Tools 入门 20m

探索断点改进

Discover breakpoint improvements

2021年6月10日

在 Apple 官方观看视频

一句话判断

Xcode 13 的断点改进看起来都是小功能,但”不暂停的日志断点”和条件断点的增强会让你的调试效率提升一个档次。

这场 Session 讲了什么

Session 展示了 Xcode 13 中调试器断点的多项改进。虽然每项改进单独看都是小功能,但组合起来大幅改善了日常调试体验。

新增功能包括:在断点编辑器中直接写 LLDB 表达式作为条件(之前需要用LLDB命令);断点支持自定义动作链(Action Chain),可以在命中时执行多个操作而不只是打印日志;“不暂停的断点”让你在断点处自动求值表达式并记录结果而不暂停程序执行。

还改进了断点的可视化管理——断点导航器(Breakpoint Navigator)现在可以按文件、类型和状态分组,支持批量启用/禁用断点。对于大型项目中动辄上百个断点的情况,这是必需的组织能力。

值得深挖的点

”不暂停的断点”是调试利器

传统断点最大的问题是它会暂停程序执行,打断你的工作流。很多时候你只是想知道”这个方法被调用了吗?参数是什么?“——你不需要暂停,你只需要一条日志。之前你可以用 NSLogos_log 手动加日志,但那需要修改代码、重新编译。现在你可以设一个断点,勾选”Automatically continue after evaluating actions”,在不修改代码、不重新编译的情况下获得日志输出。配合条件断言,你甚至可以只在特定条件下输出日志。

表达式断点的性能考量

在断点中执行 LLDB 表达式是有性能开销的——每次命中断点时,调试器需要暂停所有线程、求值表达式、然后恢复。如果你的断点在一个循环中,命中频率很高,即使不暂停也会显著拖慢程序。Session 建议在热路径(hot path)上慎用复杂表达式,保持条件简单(比如只检查一个布尔值),把复杂计算放在条件满足后的动作中。

代码片段

创建不暂停的日志断点

// 在 Xcode 中:
// 1. 点击代码行号旁设置断点
// 2. 右键断点 > Edit Breakpoint
// 3. 添加 Action: 选择 "Log Message"
// 4. 输入: "用户点击了按钮,当前值: @value@"
// 5. 勾选 "Automatically continue after evaluating actions"

// 等效的 LLDB 命令:
// breakpoint set -name "buttonTapped" \
//   -C "expression -l swift -- print(\"按钮被点击\")" \
//   -G true

条件断点的高级用法

// 只在特定条件下命中断点
// Edit Breakpoint > Condition:
// selectedIndex == 3 && items.count > 10

// 动作链:命中后执行多个操作
// Action 1: Log Message "索引: @selectedIndex@"
// Action 2: Debugger Command "frame variable items"
// Action 3: Sound "Ping"(播放提示音)

// 用 LLDB 命令创建:
// breakpoint set -file ViewController.swift -l 42 \
//   -c "items.count > 100" \
//   -C "expression -l swift -- debugPrint(items)" \
//   -G true

批量管理断点

// Breakpoint Navigator (Cmd+6) 的新功能:
// 1. 按文件分组:右键 > Sort By > File
// 2. 按类型分组:右键 > Sort By > Type
// 3. 批量禁用:选中多个 > 右键 > Disable Breakpoints
// 4. 删除所有文件断点:选中文件 > 右键 > Delete Breakpoints

// LLDB 命令:
// breakpoint disable  // 禁用所有断点
// breakpoint enable 1.2  // 启用第1组的第2个断点
// breakpoint delete -f ViewController.swift  // 删除某文件的所有断点

最佳实践

调试策略: 用不暂停的断点替代 print 调试。在调试器中设置日志断点不需要修改代码,不用重新编译,调试完直接删除断点。养成用”条件 + 不暂停 + 日志”组合的习惯,这比 NSLog 高效得多。

断点管理: 善用断点分组和批量操作。调试一个 Bug 时创建的多个断点可以一起禁用而不是逐个删掉——下次遇到类似问题时重新启用就行。

还有什么值得关注

  • Xcode 13 支持在 SwiftUI 预览中直接设置断点调试。
  • watchpoint 可以监控变量的修改,当变量值变化时自动暂停。
  • 断点配置现在可以导出和共享,方便团队成员复用调试场景。
WWDC 2021