全部产品

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

移动分析模块提供了闪退(Crash)日志上传功能,帮助开发者及时监控和捕获客户端产生的各种闪退问题。对于 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. 在 iOS 工程中,选择 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 文件,避免符号表丢失。