iOS 符号表管理

移动性能监控支持通过符号表对 iOS App 的闪退日志进行反向解析,以便定位 App 中的问题代码,帮助提高排查、解决线上异常问题的效率,同时提供 iOS 符号表管理功能以便导入、查询符号表并进行符号表反解测试。

什么是符号表

符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:

  1. <起始地址> <结束地址> <函数> [<文件名:行号>]

iOS App 出现闪退时,闪退日志中的 Crash 堆栈为混淆后的二进制信息,需要通过符号表对这些二进制堆栈信息进行反向解析,将其转换为可读的函数名和行数,以便定位 App 中出现问题的代码。

上传 iOS 符号表

对闪退日志进行符号反解前,要先上传符号表。在 iOS 平台中,dSYM 文件是保存符号表的目标文件,文件名通常为 xxx.app.dSYM,建议每次构建或发布 App 的时候,备份好 dSYM 文件。

上传 iOS 符号表的步骤如下:

  1. 在 dSYM 文件当前目录下,通过 Linux 命令 tar -czvf symbol.tgz ./xxx.app.dSYM 将 dSYM 文件压缩成 tgz 包。
  2. 登录 mPaaS 控制台,选择目标应用后,从左侧导航栏进入 性能监控 > 崩溃分析 > iOS 符号表管理 页面。
    符号表列表

  3. 单击 导入,在导入符号表弹窗中,输入符号表信息,并上传相应的符号表。

    • 版本:App 版本号。
    • Module Name:iOS App 二进制文件名称,存储在符号表文件里面用来标识出对应的 App 二进制文件,以方便用户匹配 App 二进制文件和 App 的符号表文件。
      此处填写 App 主 module 的 moduleName,例如打出的包是 Produce.app, 那么 moduleName 为 Produce
    • UUID:通用唯一识别码(Universally Unique Identifier,简称 UUID),是机器生成的唯一标识符。
      iOS 应用每次编译时都会生成一个 UUID,为保证反解成功,堆栈的 UUID 和应用的符号表文件中的 UUID 必须保持一致(也就是来自同一次编译)。还原 Crash 堆栈信息时,仅当导入的符号表文件的 UUID 与闪退日志中的 UUID 一致时,才能准确地对堆栈进行解析还原。

      此处填写 App 主 module 的 UUID,如果有多个,选择其中一个填写即可。例如有 armv7、arm64 两种架构,则会有两个 UUID,任选一个填写即可。格式上,UUID 字符串需去掉“-”,并且全部小写,例如:b7583434dc5e377bb4d8e7b69bf4c1fb。

    • 上传符号表:支持 URL 上传和本地文件上传两种方式。
      • URL 上传:输入符号表压缩后的 .tgz 文件的 URL。如果指定 URL 下没有符号表文件,会返回报错信息。
      • 本地上传:上传本地的符号表文件。
        说明:仅支持 UTF-8 编码格式,扩展名为 .tgz 的文件,文件大小不得超过 300 MB。仅支持 dSYM 格式的符号表,且需要将文件压缩成 .tgz 格式上传。
        upload
  4. 单击 导入,导入符号表。
  5. 在 iOS 符号表管理页面中查看符号表的导入状态。如果符号表状态为 Done,表示导入成功;如果为 Failed,则表示导入失败,请根据错误提示重新导入符号表文件。

导入的符号表都将展示在符号表管理页面,可根据 App 版本进行查询。

反解测试

反解测试用于验证导入的符号表文件是否有效。

反解测试的步骤如下:

  1. 在 iOS 符号表列表中,选择导入成功的目标符号表,单击操作列下的 反解测试
  2. 原始日志文本 栏中输入需要反解的闪退日志内容后,单击 反解日志日志反解结果 栏将显示反解后的日志文本,如果反解失败,会提供失败原因,例如“UUID 不匹配”等。