Xcode 中的断点(Breakpoints),这是调试代码时非常重要的工具。
断点种类与作用
1、行断点(Line Breakpoint):在指定代码行上暂停执行,最常用,用于观察变量值、判断是否执行到这行。
2、异常断点(Exception Breakpoint):捕捉所有抛出的异常(如 Objective-C 的 NSException 或 Swift 错误),用于查找 crash 原因,调试崩溃时首选。
3、符号断点(Symbolic Breakpoint):当某个方法/函数被调用时暂停,即使你没有源代码,用于跟踪系统函数/三方库调用(如 viewDidLoad()、-[UIView layoutSubviews])。
4、运行时问题断点(Runtime Issue):当 Xcode 探测到内存错误(如访问已释放对象)时中断,用于内存管理相关调试。
5、约束错误断点(Constraint Error):Auto Layout 的冲突时触发断点,用于调试界面约束问题。
6、测试失败断点(Test Failure):当测试断言失败时暂停,用于单元测试调试。
7、Swift Error Breakpoint:捕捉 try 抛出的错误,用于调试 Swift 中 throw 抛出的错误。
配置调试参数
在调试断点的过程中,需要确保在Debug模式运行(Cmd + R),而不是在:
1、没有 attach 上调试器。
2、Release 模式编译运行。
3、Crash 是在子线程但主线程还活着,断点没有触发。
解决:
在 Xcode 菜单栏,点 Product → Scheme → Edit Scheme,打开Edit Scheme视图。

点击Run → Info,勾选 Debug executable。

行断点
在Xcode左侧代码行号旁的蓝边框,可以设置一种叫“行断点(Line Breakpoint)”的最基本断点类型。
设置方式:
在代码左边灰色边栏(显示行号的地方)单击一下。
会出现一个蓝色断点圆点(代表该行执行时会中断)。

特点:
在执行到该行时中断,进入调试状态。
适用于:
1、查看变量状态。
2、判断是否执行到某处。
3、步进调试(step over / into)。
技巧:

行断点可以右键点击断点小圆点 → Edit Breakpoint…
设置条件(Condition)比如 i == 5。
设置日志打印(Log Message)。
设置自动继续执行(Continue After Evaluating)。
异常断点
在 Xcode 中添加“异常断点”(Exception Breakpoint)可以精确捕捉崩溃发生的代码位置,尤其像这种出现难以察觉的 NSGenericException 异常时。以下是操作步骤:
步骤 1:打开断点导航栏
1、打开Xcode 项目。
2、左侧导航栏中点击断点图标(Breakpoints,类似蓝色箭头),或按快捷键:⌘ + 8。

步骤 2:添加异常断点
1、点击左下角的 + 按钮(Add breakpoint)。
2、因为本次测试的是NSGenericException异常,因此选择 “Exception Breakpoint”(异常断点)。

步骤 3:配置异常断点(可选)
弹出配置框后:
Exception: 选择 “All”(所有类型异常)。
Break: 选择 “On Throw”(抛出时中断,默认即可)。
点击Xcode界面,完成配置。

断点类型

1、Swift Error Breakpoint(Swift错误断点)
作用:Swift 中使用 throw 抛出错误(可捕获的 Error 类型)时中断。
使用场景:调试 throws 函数中被抛出的错误。
备注:这不会捕捉到崩溃或 fatalError,更多用于分析流程中某个 throw 何时发生。
2、Exception Breakpoint(异常断点)
作用:在发生 Objective-C 或 Swift 抛出异常(throw) 时中断。
使用场景:调试如 NSGenericException、NSInternalInconsistencyException 这类崩溃。
推荐设置:Break on Throw(不要选 Break on Catch)
3、Symbolic Breakpoint(符号断点)
作用:在调用特定方法或函数名时中断(即使没有源代码)。
使用场景:
中断系统函数(如 viewDidLoad, -[UIView layoutSubviews])
中断第三方库中的函数(只知道名字,没有源码)
高级用法:配合符号名如 -[UIView setFrame:] 精确调试 UI 变化
4、Runtime Issue Breakpoint(运行时问题断点)
作用:捕捉运行时警告,比如强引用循环、未解除的约束、内存泄漏等。
使用场景:打开 Xcode Runtime Sanitizers 后,可以自动跳到具体出错的代码。
备注:不是立即中断,而是发生问题时中断。
5、Constraint Error Breakpoint(约束错误断点)
作用:当 Auto Layout 约束冲突或布局异常出现时中断。
使用场景:
调试 “Unable to simultaneously satisfy constraints” 报错
定位是哪个视图设置错误的约束导致布局问题
6、Test Failure Breakpoint(测试失败断点)
作用:在 XCTest 测试失败的断言处中断。
使用场景:编写了单元测试(XCTestCase),想在 XCTAssert 失败时立即中断进入调试。
定位崩溃代码行
1、设置断点(比如 Exception Breakpoint)。
2、按 Cmd + R 启动 App(模拟器或真机都可以)。
3、操作 App 重现崩溃。
4、Xcode 就会自动中断,显示崩溃点或调用栈。

例如上图中的崩溃信息为:
Thread 5: EXC_BAD_ACCESS (code=1, address=0xfffffffffffffff8)
说明访问了已经释放或非法的内存地址。而访问的这段代码是遍历 pointResults,逐个调用 context.delete(result)。
通过复制数组再删除,解决这一问题:
let safeResults = pointResults // 复制一份,避免遍历时被修改
for result in safeResults {
context.delete(result)
}
此外,也可以在调试器页面,点击报错线程跳转到代码文件:

总结
出现 crash、崩溃、闪退:添加一个 Exception Breakpoint。
逻辑出错,不知哪一行执行了:使用行断点 查看是否执行。
内存访问异常:考虑 Runtime Issue 断点。
Swift 抛出错误未捕获:可用 Swift Error Breakpoint。
断点只能在Cmd + R调试中有效,在Xcode预览中无法捕获具体的崩溃。
这是因为Comd + R启动后,App是在Xcode Debug 环境下运行,Xcode 可以捕捉崩溃、断点、日志。
点击Xcode运行图标,Xcode 没有 Attach 到进程,断点、异常都不会触发。
Xcode预览中运行的是局部UI,没有完整运行 App 逻辑,很多代码根本不会触发。
如果运行Xcode未能捕获到具体的崩溃行,可以多尝试几次。