iOS 崩溃日志分析与定位 从手动符号化到自动分析
有次线上版本收到用户反馈 App 频繁闪退,拿到用户的崩溃日志后,一看是 .ips 格式的原始文件,堆栈里全是地址偏移量,看不出崩溃在哪里。要定位问题得先做符号化——把内存地址映射回代码里的类名和方法名。这个过程在 Xcode 里可以用 Devices 窗口导出符号化日志,但脱离 Xcode 环境时处理起来就比较绕。
symbolicatecrash 手动符号化
Xcode 自带的 symbolicatecrash 脚本是做崩溃日志符号化的常规方式。命令行执行:export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer && symbolicatecrash crash.crash > symbolicated.crash。前提是需要有对应版本的 .dSYM 符号文件,以及崩溃日志所在版本的 App 二进制文件。
symbolicatecrash 的效果很可靠,但操作有几步:找到对应的 .dSYM 文件、放到指定目录、跑命令、查看结果。如果手头没有 .dSYM,或者符号文件和崩溃日志版本不一致,符号化会失败。每次打包后保留对应版本的 .dSYM 文件是前提,漏了就没办法回溯了。
Xcode Organizer 的崩溃管理
Xcode 的 Organizer 里 Crashes 面板会收集来自 App Store 的用户崩溃报告,直接展示符号化后的结果,按数量排序展示发生次数最多的崩溃。这是查看线上崩溃最方便的方式,不需要手动符号化。但依赖 Xcode 环境,只能看到提交到 App Store 的应用的崩溃数据,开发和测试阶段的本地崩溃不会出现在这里。
KeyMob 的崩溃日志模块
KeyMob 查看崩溃日志的入口在文件管理 → 日志文件目录下。连上设备后在右侧文件列表中能看到 CrashReporter 目录,里面是按"应用名-日期-时间.ips"格式命名的崩溃日志文件。单击可以直接查看原始内容,勾选后点保存可以复制到电脑。
原始崩溃日志里包含 App 名称、版本号、设备型号、系统版本和崩溃堆栈。KeyMob 也支持查看性能诊断数据和网络活动记录,崩溃日志可以和实时日志、性能数据结合分析。
用 KeyMob 查看崩溃日志和实时日志配合使用——先看实时日志中闪退前的最后一次输出,再到崩溃日志里看堆栈信息。对比不同时间段的日志文件,能发现崩溃频率的变化趋势。
建议
Xcode Organizer 比较适合查看线上用户反馈的崩溃,自动符号化方便定位。开发调试阶段遇上偶发闪退,KeyMob 直接读取设备上的崩溃日志比每次连 Xcode 等加载要快一些。手动 symbolicatecrash 作为备选方案,关键是要保留好每个版本的 .dSYM 文件。
