全部产品
云市场

移动分析控制台中的Crash日志没有反解

更新时间:2020-03-25 20:54:48

背景

移动分析模块提供了崩溃日志上传功能,帮着开发者及时监控和捕获客户端产生的各种崩溃问题。对于 Android 应用,崩溃日志在上传时已经自动对崩溃点的调用栈进行了符号化,可以直接定位到崩溃的代码。而 iOS 平台则需要在控制台上传符号表。

什么是符号表

符号表是内存地址与代码中的函数名、行号之间的映射关系表。

为什么需要符号表

iOS App 上传的崩溃日志中包括的调用栈信息都是通过内存地址记录的,开发者无法直观的看到崩溃发生时对应的代码调用栈信息。为了能便捷地定位 Crash 发生的代码位置,mPaaS 服务端需要使用符号表对 iOS Crash 日志的程序堆栈进行解析和还原。例如:
解析前:

  1. 18 NebulaTest 0x00000001030f6b7c 0x104ad4000 + 9282380
  2. 19 NebulaTest 0x00000001030f6ed4 0x104ad4000 + 9283236
  3. 20 NebulaTest 0x00000001030f6d0c 0x104ad4000 + 9282780
  4. 21 NebulaTest 0x00000001030f6ed4 0x104ad4000 + 9283236
  5. 22 NebulaTest 0x00000001030f6d0c 0x104ad4000 + 9282780

解析后:

  1. 18 NebulaTest 0x00000001030f6b7c -[DTJsonEncoder encodeObject:ofClass:recusive:] + 424
  2. 19 NebulaTest 0x00000001030f6ed4 -[DTJsonEncoder encodeObject:] + 280
  3. 20 NebulaTest 0x00000001030f6d0c -[DTJsonEncoder encodeObject:ofClass:recusive:] + 824
  4. 21 NebulaTest 0x00000001030f6ed4 -[DTJsonEncoder encodeObject:] + 280
  5. 22 NebulaTest 0x00000001030f6d0c -[DTJsonEncoder encodeObject:ofClass:recusive:] + 824

iOS 项目获取 dSYM 符号表文件

XCode 在 Release 编译模式下默认会生成 dSYM 文件。
在 Debug 编译模式下需要额外配置:

  1. Build Settings > Code Generation > Generate Debug Symbols > Yes
    编译1
  2. Build Settings > Build Option > Debug Information Format > DWARF with dSYM File
    编译2

编译成功后,打开 App 所在对文件夹:
编译成功
此时应该可以看到在产生在同一目录下的 dSYM 符号表文件:
符号表文件

mPaaS 控制上传符号表

在苹果商店发布应用后,开发者需要在 mPaaS 控制台上正确添加对应版本号的发布任务。
添加完发布任务后,上传对应的符号表文件:
上传符号表添加符号表
如果一切配置正常,此后该版本产生的崩溃日志,在 mPaaS 控制台均能看到解析后的崩溃日志。

注意:如果已经 iOS 项目已经上传符合表,依然不能解析 iOS App 崩溃日志,请务必本地确认该符号表能否手动解析闪退日志。
如果崩溃日志解析结果不全或不正确,请确认该符号表和实际 App 版本之间是否完全匹配。
开发者一定要管理和备份好发布版本的符号表 dSYM 文件,避免符号表丢失。