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