Xcode断点
Xcode断点

Xcode断点

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未能捕获到具体的崩溃行,可以多尝试几次。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注