# 调试 iOS 应用:收集系统日志的 7 种方法
iOS 日志记录应用内部事件:网络请求、错误、UI 冻结和崩溃。这些日志有助于在没有视觉指示的情况下精确定位问题。例如,Pokemon GO 中的 EXC_BAD_ACCESS、Console 中的主线程 I/O 操作,以及 log collect 中的 CFNetwork 超时。
日志分为崩溃报告(EXC_BAD_ACCESS、SIGSEGV)和诊断报告(性能、网络、内存)。测试人员使用它们来验证函数调用、分析服务器交互,并发现隐藏 bug。
通过 sysdiagnose 获取 .ips 文件
自动生成的报告可在“设置 → 隐私与安全性 → 分析与改进 → 分析数据”中找到。格式:event_type_date_time.ips,例如 AtiClient-2024-08-14-152242.ips。
报告类型:
- CrashReport:异常和信号(按 bundle ID,例如 VKClient)。
- JetsamEvent:由于内存不足卸载(内存泄漏)。
- Watchdog:启动超时或挂起。
- SpinReport:高 CPU 使用率无响应(死锁)。
- NotificationServiceExtension:推送通知失败。
手动生成:同时按下音量键 + 侧边按钮(1–1.5 秒),生成文件 stacks。
通过 AirDrop 导出。文件会自动删除——立即收集。
使用场景:无 Xcode 的故障、内存/网络分析。
log collect CLI:用于归档的命令行工具
需要 Xcode 命令行工具、USB 连接、Terminal。通过 libimobiledevice 获取 UDID。
收集长达 10 天的日志(相较 sysdiagnose 的瞬间快照)。更快、可自动化、可控制大小。
基本命令:
sudo log collect --device-udid <UDID> --last 10m --output iphone_logs.logarchive
关键参数:
--output ~/Desktop/iphone_logs.logarchive— 保存路径。--last 30m / 2h / 1d— 时间段。--start "2025-08-20" --end "2025-08-20 14:30:00"— 日期。--size 100m— 大小限制。--device-udid A1B2C3D4R5F8G8H8I1J0— 按 UDID(首选)。
分析:
log show --archive system_logs.logarchive --predicate 'process == "AtiClient" AND messageType == "error"'
过滤器:进程、错误、时间段。
与 sysdiagnose 比较:
| 参数 | log collect | sysdiagnose |
|----------|-------------|-------------|
| 时间 | 最长 10 天 | 生成当天 |
| 自动化 | 命令行 | 手动 |
| 大小 | 可控制 | 较大 |
| 速度 | 快 | 10–15 分钟 |
使用场景:不稳定 bug、性能趋势、崩溃上下文。
Console:实时监控
Xcode → 窗口 → 设备与模拟器 → 打开 Console。按进程过滤(例如 AtiClient)。显示实时信息:主线程挂起风险、libRPAC.dylib 失败。
示例日志:
Hang Risk com.apple.runtime-issues
message: This method does I/O on the main thread...
libRPAC.dylib failure 19:12:18.350727+0300 AtiClient
导出为 .logarchive 以进行离线分析。
方法 4–7:高级收集
- Xcode 设备与模拟器:按 UDID 获取日志,按子系统过滤(CFNetwork、Jetsam)。
- libimobiledevice:使用
idevicesyslog无需 Xcode 流式传输日志。
idevicesyslog -u <UDID>
- 代码中的 os_log:通过
os_log_t和os_logAPI 添加自定义日志。级别:debug、info、error。
- Instruments:带日志的性能分析(Time Profiler、Leaks)。
关键要点
- .ips 用于即时故障(CrashReport、Jetsam)。
- log collect 用于长期趋势(最长 10 天,命令行)。
- Console 用于主线程 I/O 的实时调试。
- 需要 UDID 以精确定位设备。
- 结合使用:sysdiagnose + log show 进行完整分析。
— Editorial Team
暂无评论。