还记得你第一次使用NSLog(@"Hello, World!")的时刻吗?那是调试的起点。但随着应用复杂度呈指数级增长,我们需要的工具也经历了革命性进化:
- 第一代:基础输出(
NSLog、print) - 第二代:图形化界面(Xcode调试器、Instruments)
- 第三代:运行时动态调试(FLEX、Lookin)
- 第四代:智能化监控(性能追踪、自动化检测)
今天,一个成熟的iOS开发者工具箱中,至少需要掌握3-5种核心调试工具,它们就像外科医生的手术刀——精准、高效、各有所长。
一、运行时调试工具
1. FLEX (Flipboard Explorer)
功能最全的运行时调试套件,集成后可以测试期间随时开启\关闭工具条,比如设置摇一摇后启动。
1优点: 功能全面,无需连接电脑 2缺点: 内存占用稍大 3场景: 日常开发调试、UI问题排查 4GitHub: https://github.com/FLEXTool/FLEX?tab=readme-ov-file 5
主要功能:
- 手机上检查和修改层次结构中的视图。
- 查看对象内存分配,查看任何对象的属性和ivar,动态修改许多属性和ivar,动态调用实例和类方法。
- 查看详细的网络请求历史记录,包括时间、标头和完整响应。
- 查看系统日志消息(例如,来自NSLog)。
- 查看沙盒中的文件,查看所有的bundle和资源文件,浏览文件系统中的SQLite/Rerm数据库。
- 动态查看和修改NSUserDefaults值。
2. Lookin - 腾讯出品
3D视图层级工具,类Xcode Inspector和Reveal。相比Xcode中查看图层的优势有两个:
- 独立于Xcode运行,不会被Xcode阻断,能显示view的被引用的属性名。
- 集成了'LookinServer'库的APP启动后,在Mac上启动
Lookin后即可刷新显示当前图层。(真机需连接电脑后才展示)
1// 集成步骤一:官网下载lookin; 2- 官网: https://lookin.work 3- GitHub: https://github.com/QMUI/LookinServer 4 5// 集成步骤二: 6CocoaPods安装: 7// 1.如果是OC工程 8pod 'LookinServer', :configurations => ['Debug'] 9// 2.如果是OC工程 10// 在 iOS 项目的 Podfile 中 添加 “Swift” 这个 Subspec 11pod 'LookinServer', :subspecs => ['Swift'], :configurations => ['Debug'] 12// 或者添加 “SwiftAndNoHook”这个 Subspec 也行 13pod 'LookinServer', :subspecs => ['SwiftAndNoHook'], :configurations => ['Debug'] 14 15
二、网络调试工具
1. Proxyman - 现代网络调试神器
1// 官网: https://proxyman.io 2// 特点: 3✅ 现代UI,操作流畅 4✅ HTTPS解密(无需安装证书到系统) 5✅ 重放、修改、拦截请求 6✅ Map Local/Map Remote功能 7✅ 脚本支持(JavaScript) 8✅ 支持Apple Silicon 9 10使用场景: 11• API接口调试 12• 图片/资源请求优化 13• 模拟慢速网络 14• 修改响应数据测试 15
2. Charles - 老牌网络代理
1// 官网: https://www.charlesproxy.com 2// 特点: 3✅ 功能极其全面 4✅ 跨平台支持 5✅ 脚本功能强大(Charles Proxy Script) 6✅ 带宽限制、断点调试 7✅ 支持HTTP/2、HTTP/3 8 9设置步骤: 101. 安装Charles 112. 在iOS设备设置代理 123. 安装Charles根证书 134. 信任证书(设置→通用→关于→证书信任设置) 14 15// 常用功能: 16• Breakpoints(请求拦截修改) 17• Rewrite(规则重写) 18• Map Local(本地文件映射) 19• Throttle(网络限速) 20
3. mitmproxy - 开源命令行工具
1# 官网: https://mitmproxy.org 2# 特点: 3✅ 完全开源免费 4✅ 命令行操作,适合自动化 5✅ 脚本扩展(Python) 6✅ 支持透明代理 7 8# 安装: 9brew install mitmproxy 10 11# 使用: 12# 启动代理 13mitmproxy --mode transparent --showhost 14 15# iOS设置: 16# 1. 安装证书: mitm.it 17# 2. 配置Wi-Fi代理 18
三、UI/布局调试工具
1. Reveal - 专业的UI调试工具
1// 官网: https://revealapp.com 2// 特点: 3✅ 实时3D视图层级 4✅ 详细的AutoLayout约束查看 5✅ 内存图查看器 6✅ 支持SwiftUI预览 7✅ 强大的筛选和搜索 8 9// 集成: 10// 方式1: 通过Reveal Server框架 11pod 'Reveal-SDK', :configurations => ['Debug'] 12 13// 方式2: LLDB加载(无需集成代码) 14(lldb) expr (void)[[NSClassFromString(@"IBARevealLoader") class] revealApplication]; 15 16// 价格: 付费(提供免费试用) 17
2. InjectionIII - 热重载神器
1// GitHub: https://github.com/johnno1962/InjectionIII 2// 特点: 3✅ 代码修改后实时生效 4✅ 无需重新编译运行 5✅ 支持Swift和Objective-C 6✅ 保留应用状态 7 8// 安装: 9# App Store搜索 "InjectionIII" 10 11// 配置: 121. 下载安装InjectionIII 132. 在AppDelegate中配置: 14#if DEBUG 15Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/iOSInjection.bundle")?.load() 16#endif 17 183. 项目添加文件监视: 19// 在InjectionIII App中添加项目路径 20
四、性能调试工具
1. Xcode Instruments - 官方性能分析套件
1// 核心工具集: 2┌─────────────────────────────────────┐ 3│ Xcode Instruments │ 4├─────────────────────────────────────┤ 5│ Time Profiler # CPU使用分析 │ 6│ Allocations # 内存分配分析 │ 7│ Leaks # 内存泄漏检测 │ 8│ Network # 网络活动分析 │ 9│ Energy Log # 电量消耗分析 │ 10│ Metal System # GPU性能分析 │ 11│ SwiftUI # SwiftUI性能分析 │ 12└─────────────────────────────────────┘ 13 14// 使用技巧: 151. 录制时过滤系统调用: 16 Call Tree: ✅ Hide System Libraries 17 ✅ Invert Call Tree 18 ✅ Flattern Recursion 19 202. 内存图调试: 21 Debug Memory Graph按钮 22 查看循环引用、内存泄漏 23 243. 使用Markers: 25 import os 26 let log = OSLog(subsystem: "com.app", category: "performance") 27 os_signpost(.begin, log: log, name: "Network Request") 28 // ... 操作 29 os_signpost(.end, log: log, name: "Network Request") 30
2. MetricKit - 线上性能监控框架
1// Apple官方性能数据收集框架 2import MetricKit 3 4class MetricKitManager: MXMetricManagerSubscriber { 5 static let shared = MetricKitManager() 6 7 private init() { 8 let manager = MXMetricManager.shared 9 manager.add(self) 10 } 11 12 func didReceive(_ payloads: [MXMetricPayload]) { 13 // 接收性能数据 14 for payload in payloads { 15 print("CPU: \(payload.cpuMetrics)") 16 print("内存: \(payload.memoryMetrics)") 17 print("启动时间: \(payload.launchMetrics)") 18 print("磁盘IO: \(payload.diskIOMetrics)") 19 } 20 } 21 22 func didReceive(_ payloads: [MXDiagnosticPayload]) { 23 // 接收诊断数据(崩溃、卡顿等) 24 } 25} 26 27// 需要用户授权,适合生产环境监控 28
3. Tracy - 腾讯开源的性能监控
1// GitHub: https://github.com/Tencent/tracy 2// 特点: 3✅ 卡顿监控(主线程阻塞检测) 4✅ 内存泄漏检测 5✅ 大对象分配监控 6✅ 网络性能监控 7✅ 崩溃收集 8 9// 集成: 10pod 'Tracy', :configurations => ['Debug'] 11 12// 使用: 13Tracy.start() 14// 自动监控各种性能指标 15
五、内存/崩溃调试工具
1. MLeaksFinder - 腾讯出品的内存泄漏检测
1// GitHub: https://github.com/Tencent/MLeaksFinder 2// 特点: 3✅ 自动检测视图控制器内存泄漏 4✅ 无需编写任何代码 5✅ 支持自定义白名单 6✅ 精准定位泄漏对象 7 8// 原理: 9// 监听UIViewController的pop/dismiss 10// 延迟检查是否仍然存在 11 12// 集成: 13pod 'MLeaksFinder' 14 15// 自定义配置: 16// 1. 添加白名单 17[NSClassFromString(@"WhiteListClass") class] 18 19// 2. 忽略特定泄漏 20[MLeaksFinder addIgnoreClass:[IgnoreClass class]] 21
2. FBRetainCycleDetector - Facebook循环引用检测
1// GitHub: https://github.com/facebook/FBRetainCycleDetector 2// 特点: 3✅ 检测Objective-C对象的循环引用 4✅ 支持检测NSTimer的强引用 5✅ 可集成到单元测试中 6✅ Facebook内部广泛使用 7 8// 使用: 9let detector = FBRetainCycleDetector() 10detector.addCandidate(myObject) 11let cycles = detector.findRetainCycles() 12 13// 输出格式化的循环引用链 14for cycle in cycles { 15 print(FBRetainCycleDetectorFormatter.format(cycle)) 16} 17
3. KSCrash - 强大的崩溃收集框架
1// GitHub: https://github.com/kstenerud/KSCrash 2// 特点: 3✅ 捕获所有类型崩溃(OC异常、C++异常、Mach异常等) 4✅ 生成完整的崩溃报告 5✅ 支持符号化 6✅ 可自定义上报服务器 7 8// 集成: 9pod 'KSCrash' 10 11// 配置: 12import KSCrash 13 14let installation = makeEmailInstallation("crash@company.com") 15installation.addConditionalAlert(withTitle: "Crash Detected", 16 message: "The app crashed last time") 17KSCrash.shared().install() 18 19// 高级功能: 20// 1. 用户数据记录 21KSCrash.shared().userInfo = ["user_id": "123"] 22 23// 2. 自定义日志 24KSCrash.shared().log.error("Something went wrong") 25 26// 3. 监控卡顿 27KSCrash.shared().monitorDeadlock = true 28
六、日志调试工具
1. CocoaLumberjack - 专业日志框架
1// GitHub: https://github.com/CocoaLumberjack/CocoaLumberjack 2// 特点: 3✅ 高性能日志记录 4✅ 多日志级别(Error, Warn, Info, Debug, Verbose) 5✅ 多种输出目标(Console, File, Database) 6✅ 日志轮转和清理 7✅ 支持Swift和Objective-C 8 9// 集成: 10pod 'CocoaLumberjack/Swift' 11 12// 配置: 13import CocoaLumberjackSwift 14 15// 控制台日志 16DDLog.add(DDOSLogger.sharedInstance) 17 18// 文件日志 19let fileLogger = DDFileLogger() 20fileLogger.rollingFrequency = 60 * 60 * 24 // 24小时 21fileLogger.logFileManager.maximumNumberOfLogFiles = 7 22DDLog.add(fileLogger) 23 24// 使用: 25DDLogError("错误信息") 26DDLogWarn("警告信息") 27DDLogInfo("普通信息") 28DDLogDebug("调试信息") 29DDLogVerbose("详细信息") 30 31// 上下文过滤: 32let context = 123 33DDLogDebug("带上下文的消息", context: context) 34
2. SwiftyBeaver - Swift专用日志框架
1// GitHub: https://github.com/SwiftyBeaver/SwiftyBeaver 2// 特点: 3✅ 纯Swift实现 4✅ 彩色控制台输出 5✅ 多种目的地(Console, File, Cloud) 6✅ 平台同步(macOS App) 7✅ 支持emoji和格式化 8 9// 使用: 10import SwiftyBeaver 11let log = SwiftyBeaver.self 12 13// 添加控制台目的地 14let console = ConsoleDestination() 15console.format = "$DHH:mm:ss$d $L $M" 16log.addDestination(console) 17 18// 添加文件目的地 19let file = FileDestination() 20file.logFileURL = URL(fileURLWithPath: "/path/to/file.log") 21log.addDestination(file) 22 23// 日志级别: 24log.verbose("详细") // 灰色 25log.debug("调试") // 绿色 26log.info("信息") // 蓝色 27log.warning("警告") // 黄色 28log.error("错误") // 红色 29
3. XCGLogger - 功能丰富的日志框架
1// GitHub: https://github.com/DaveWoodCom/XCGLogger 2// 特点: 3✅ 高度可配置 4✅ 支持日志过滤 5✅ 自定义日志目的地 6✅ 自动日志轮转 7✅ 详细的文档 8 9// 使用: 10import XCGLogger 11 12let log = XCGLogger.default 13 14// 配置 15log.setup(level: .debug, 16 showLogIdentifier: false, 17 showFunctionName: true, 18 showThreadName: true, 19 showLevel: true, 20 showFileNames: true, 21 showLineNumbers: true, 22 showDate: true) 23 24// 自定义过滤器 25log.filters = [ 26 Filter.Level(from: .debug), // 只显示.debug及以上 27 Filter.Path(include: ["ViewController"], exclude: ["ThirdParty"]) 28] 29 30log.debug("调试信息") 31log.error("错误信息") 32
七、自动化调试工具
1. Fastlane - 自动化工具集
1# 官网: https://fastlane.tools 2# 特点: 3✅ 自动化构建、测试、部署 4✅ 丰富的插件生态 5✅ 与CI/CD深度集成 6✅ 跨平台支持 7 8# 常用命令: 9fastlane screenshots # 自动截图 10fastlane beta # 发布测试版 11fastlane release # 发布正式版 12fastlane match # 证书管理 13 14# 集成调试功能: 15lane :debug_build do 16 # 1. 设置调试配置 17 update_app_identifier( 18 app_identifier: "com.company.debug" 19 ) 20 21 # 2. 启用调试功能 22 update_info_plist( 23 plist_path: "Info.plist", 24 block: proc do |plist| 25 plist["FLEXEnabled"] = true 26 plist["NSAllowsArbitraryLoads"] = true 27 end 28 ) 29 30 # 3. 构建 31 gym( 32 scheme: "Debug", 33 export_method: "development" 34 ) 35end 36
2. slather - 代码覆盖率工具
1# GitHub: https://github.com/SlatherOrg/slather 2# 特点: 3✅ 生成代码覆盖率报告 4✅ 支持多种输出格式(html, cobertura, json) 5✅ 与CI集成 6✅ 过滤第三方库代码 7 8# 安装: 9gem install slather 10 11# 使用: 12# 1. 运行测试并收集覆盖率 13xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 14' -enableCodeCoverage YES 14 15# 2. 生成报告 16slather coverage --html --show --scheme MyApp MyApp.xcodeproj 17 18# 3. 在Jenkins中集成 19slather coverage --input-format profdata --cobertura-xml --output-directory build/reports MyApp.xcodeproj 20
八、特殊场景调试工具
1. SparkInspector - 实时对象监控
1// 官网: https://sparkinspector.com 2// 特点: 3✅ 实时监控所有对象实例 4✅ 查看对象属性变化 5✅ 方法调用追踪 6✅ 内存泄漏检测 7 8// 集成: 9// 1. 下载Spark Inspector应用 10// 2. 集成框架到项目 11// 3. 通过Spark Inspector连接调试 12 13// 适用场景: 14• 复杂的对象关系调试 15• 观察模式数据流 16• 内存泄漏定位 17
3. LLDB - 底层调试神器
1# Xcode内置,但功能极其强大 2# 常用命令: 3 4# 1. 查看变量 5(lldb) po variable 6(lldb) p variable 7(lldb) v variable 8 9# 2. 修改变量 10(lldb) expr variable = newValue 11 12# 3. 调用方法 13(lldb) expr [self doSomething] 14(lldb) expr self.doSomething() 15 16# 4. 断点命令 17(lldb) breakpoint set -n "[ClassName methodName]" 18(lldb) breakpoint command add 1 # 为断点1添加命令 19> po $arg1 20> continue 21> DONE 22 23# 5. 内存查看 24(lldb) memory read 0x12345678 25(lldb) memory write 0x12345678 0x42 26 27# 6. 自定义LLDB命令 28(lldb) command regex rlook 's/(.+)/image lookup -rn %1/' 29(lldb) rlook methodName 30 31# 7. Swift特定命令 32(lldb) frame variable -L # 显示局部变量 33(lldb) type lookup String # 查看类型信息 34
九、工具矩阵
| 需求场景 | 推荐工具 | 理由 |
|---|---|---|
| 日常开发调试 | FLEX + Proxyman | 功能全面,无需额外环境 |
| UI/布局问题 | Lookin + Reveal | 3D视图,实时修改 |
| 性能优化 | Xcode Instruments + Tracy | 官方工具+线上监控 |
| 内存泄漏 | MLeaksFinder + FBRetainCycleDetector | 自动检测+深度分析 |
| 网络调试 | Proxyman/Charles | 功能专业,操作友好 |
| 日志管理 | CocoaLumberjack + SwiftyBeaver | 功能强大+美观输出 |
| 自动化 | Fastlane + slather | 流程自动化+质量监控 |
| 底层调试 | LLDB + InjectionIII | 深度控制+热重载 |
团队规范建议
1# iOS团队调试工具规范 2 3## 必装工具(所有开发者) 41. Proxyman/Charles - 网络调试 52. Lookin - UI调试 63. InjectionIII - 热重载 7 8## 项目集成(Podfile) 9```ruby 10target 'MyApp' do 11 # 调试工具(仅Debug) 12 pod 'FLEX', :configurations => ['Debug'] 13 pod 'CocoaLumberjack', :configurations => ['Debug'] 14 pod 'MLeaksFinder', :configurations => ['Debug'] 15end 16
总结
核心建议:
- 不要过度依赖单一工具 - 不同工具有不同适用场景
- 掌握核心原理 - 理解工具背后的工作原理比单纯使用更重要
- 建立个人调试工具箱 - 根据习惯组合适合自己的工具集
- 关注新工具发展 - iOS开发工具生态在持续进化
- 重视自动化 - 将重复调试工作自动化,提高效率
终极目标: 快速定位问题 → 深入分析原因 → 有效解决问题
这些工具大多数都有免费版本或开源版本,建议从最常用的几个开始,逐步建立自己的调试能力体系。
掌握这些工具,不是为了炫耀技术,而是为了让你的代码更健壮,让你的用户更满意,让你自己在深夜加班时少掉几根头发。
《iOS 常用调试工具大全-打造你的调试武器库》 是转载文章,点击查看原文。