XCode调试 设置全局断点并快速定位问题代码所在行

本文介绍了两种XCode调试方法,如何通过设置全局断点快速定位程序错误代码行。包括为-[NSException raise]和objc_exception_throw创建断点,以及在异常发生时调试器如何指示问题代码行。

XCode调试技巧 设置全局断点并快速定位问题代码所在行是本文要介绍的内容,很多时候,在调试程序的时候,我们很想马上知道错误的代码在哪一行。 而不想大概设置一个断点,逐行调试发现最终是哪一行代码出问题导致程序崩溃。可以使用下面这个办法快速定位问题代码。

第一种方法

选择Run–>Show–>Breakpoints,进入断点窗口

XCode调试 设置全局断点并快速定位问题代码所在行

Xcode的断点窗口

首先需要为-[NSException raise]创建一个断点。 选择Global Breakpoints, 双击Double-click for Symbol框, 输入-[NSException raise],然后按return键。

XCode调试 设置全局断点并快速定位问题代码所在行

添加了断点-NSException raise后

其次,再按照上面的步骤添加另外一个全局断点objc_exception_throw。

现则,运行的程序有异常抛出的时候,调试器就会中止程序运行并指向有问题的代码行。

第二种方法:

有好多异常 ,无法正常进入断点 ,程序会直接退出,比如:

XCode调试 设置全局断点并快速定位问题代码所在行

这时候我们甚至不知道使在哪出现的这个错误,OK,打开Run>>Debugger 找到程序退出位置:

XCode调试 设置全局断点并快速定位问题代码所在行

然后添加一个软断点 Run->Manage Breakpoints -> Add symbolic breakpoint, 并输入 objc_exception_throw

XCode调试 设置全局断点并快速定位问题代码所在行

重新运行调试 :

XCode调试 设置全局断点并快速定位问题代码所在行

错在哪儿是不是很容易就找到了 :)

第一种方法本人尝试可用,第二种估计也能行。。。

小结:XCode调试 设置全局断点并快速定位问题代码所在行的内容介绍完了,希望本文对你有所帮助!


Xcode调试控制台(Debug Console)中,当你看到打印输出(比如 `print("Hello")` 或 `NSLog`),但不知道是哪一行代码输出的,这是一个非常常见的问题。 > ❓“Xcode 打印台打印的东西怎么定位到是哪一个语句打印的?” 我们来一步步教你 **如何精准定位打印语句来源**,提供几种增强可追溯性的方法。 --- ## ✅ 一、为什么默认打印不显示行号? Swift 的 `print()` 函数默认只输出内容,**不会自动显示文件名、行号、函数名**。例如: ```swift print("User logged in") ``` 输出: ``` User logged in ``` 👉 没有任何上下文信息 —— 你无法知道这是哪个类、哪个方法、第几行打印的。 --- ## ✅ 二、解决方案:自定义打印函数(推荐) ### ✅ 方法 1:使用 `#file`, `#line`, `#function` 自动注入位置信息 ```swift func debugPrint(_ message: Any, file: String = #file, line: Int = #line, function: String = #function) { let fileName = (file as NSString).lastPathComponent print("[\(fileName):\(line)] \(function) -> \(message)") } ``` #### 使用方式: ```swift debugPrint("用户登录成功") ``` #### 输出结果: ``` [LoginViewController.swift:45] loginButtonTapped(sender:) -> 用户登录成功 ``` ✅ 完美定位到:文件、行号、函数! --- ### ✅ 方法 2:替换全局 `print`(谨慎使用) 如果你希望所有 `print` 都带位置信息,可以**临时屏蔽系统 print**(仅用于开发阶段): ```swift // 在某个调试专用文件中定义 import Foundation func print(_ message: Any, file: String = #file, line: Int = #line, function: String = #function) { let fileName = (file as NSString).lastPathComponent Swift.print("[\(Date())][\(fileName):\(line)] \(function):\n👉 \(message)") } ``` ⚠️ 注意:这会覆盖全局 `print`,发布前务必移除! --- ## ✅ 三、使用断点 + 控制台命令精确定位 即使你不改代码,也可以通过以下方式定位: ### 🔍 方法 3:设置符号断点(Symbolic Breakpoint)拦截 `print` 1. 打开 **Breakpoint Navigator**(⌘ + 6) 2. 点击左下角 `+` → **Add Symbolic Breakpoint** 3. 输入符号: ``` Swift.print ``` 4. 可选:添加 Action → `po $arg1` 输出参数 5. 勾选 “Automatically continue after evaluating actions” 可避免中断 👉 这样每次调用 `print` 时都会触发断点,你可以查看调用栈(Call Stack)找到具体位置。 --- ### 🧪 示例:符号断点配合 LLDB 调试 当命中断点后,在 lldb 控制台输入: ```bash bt ``` 输出调用栈,类似: ``` * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 * frame #0: 0x000000010c8d4abc MyApp`Swift.print(_:separator:terminator:to:) frame #1: 0x000000010c8d4a00 MyApp`specialized static MyViewModel.login(username:) at LoginViewModel.swift:36 frame #2: 0x000000010c8d4900 MyApp`@objc MyViewController.loginAction() at MyViewController.swift:78 ``` 📌 第二行告诉你:`LoginViewModel.swift` 第 36 行调用了 `print` --- ## ✅ 四、使用日志框架(专业项目建议) 对于大型项目,推荐使用专业的日志库,它们自带文件/行号追踪: ### 推荐框架: | 框架 | 特点 | |------|------| | [SwiftyBeaver](https://github.com/SwiftyBeaver/swiftybeaver) | 支持颜色、文件输出、Xcode 高亮 | | [XCGLogger](https://github.com/DaveWoodCom/XCGLogger) | 功能强大,支持等级、线程、上下文 | | OSLog (Apple 官方) | iOS 10+,性能好,集成 Instruments | #### 示例:XCGLogger ```swift let log = XCGLogger.default log.info("This will show file and line by default") ``` 输出: ``` 2025-04-05 15:30:45 info: [MyViewController.swift:45] User tapped login button ``` --- ## ✅ 五、小技巧:给 print 加标记 最简单粗暴的方式(适合临时调试): ```swift print("➡️ [LoginVC Line 50] 登录成功") ``` 虽然不够优雅,但在快速排查时很有效。 --- ## ✅ 六、如何在控制台快速搜索? 在 Xcode 控制台右上角有一个搜索框 🔍 你可以: - 输入关键字如 `"登录"` - 或输入文件名 `LoginViewController` - 快速定位相关日志 💡 结合 `debugPrint()` 输出格式化日志,搜索效率更高! --- ## ✅ 七、总结:四种主流方案对比 | 方案 | 是否需要改代码 | 是否精确 | 推荐场景 | |------|----------------|----------|-----------| | 自定义 `debugPrint` | ✅ 是 | ✅✅✅ | 日常开发首选 | | 符号断点 + bt | ❌ 否 | ✅✅ | 不改代码快速定位 | | 替换全局 `print` | ✅ 是 | ✅✅✅ | 临时调试(慎用) | | 使用日志框架 | ✅ 是 | ✅✅✅✅ | 大型项目/生产环境 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值