Skip to main content

符号表

1. 什么是符号表?

对于不同平台来说,符号表的意义略有差异。对于Android平台来说,包含两类符号表,一类是SO的符号表,另一类是Java的mapping文件。对于iOS平台来说,符号表指dSYM文件。无论是哪类符号表,其目的都是将混淆后的堆栈进行还原,还原成开发可读的文件名、方法名及行号。

示例1: Android Java堆栈还原

Img 4

示例2: Android Native堆栈还原 Img 5

示例3: iOS 堆栈还原 Img 6

详细请查看各平台的符号表介绍:

2. 怎样上传符号表?

当前Bugly支持两种符号表上传方式,一种是通过网页上传,另一种是通过符号表工具上传。

方式一:网页上传

详细见 《网页上传符号表》

方式二:符号表工具上传

详细见 《符号表上传工具》

3. 怎样管理符号表?

用户可以在 设置/符号表 查看当前产品的符号表信息。

  1. 查看指定的符号表是否已经上传;

  2. 上传符号表;

  3. 查看产品符号表的整体情况;

  4. 重新上传指定符号表文件;

Img 2

详细参考:

4. 怎样区分符号表?

还原时,怎么确定取哪个符合表来翻译呢?我们以异常堆栈的场景来进行说明:

Android Java堆栈

  • 符号表文件为mapping文件;
  • 通过App版本,构建号定位查找符号表文件;
  • 相同App版本且相同构建,支持同时上传多个mapping文件,通过文件名区分;
  • 符号还原时,会根据App版本和构建号,找出符合条件的mapping文件,将这些mapping文件组成一个大mapping,再进行翻译;

Android Native堆栈

  • 符号表为包含符号信息的so;
  • 通过so的uuid来查找符号表,即同一次构建可以同时生成包含符号表的so,以及移除了符号表的so,他们的uuid是一样的;
  • App版本,构建号,CPU构建,以及模块名只是增强可读性,so的UUID是唯一标识;

iOS 堆栈

  • 符号表文件为dSYM文件;
  • 通过UUID来查找符号表;
  • App版本,构建号,CPU构建,以及模块名只是增强可读性,UUID是唯一标识;

JS堆栈

  • 符号表文件为sourcemap文件;
  • 通过App版本,构建号定位查找符号表文件;
  • 相同App版本且相同构建,支持同时上传多个sourcemap文件,通过文件名区分;
  • 符号还原时,会根据App版本和构建号,找出符合条件的sourcemap文件,将所有的文件组成一个大sourcemap,再进行翻译;

5. 什么是UUID?

Android的SO符号表,iOS的dSYM文件通过UUID来唯一标识一个符号表文件。SDK在捕获到异常堆栈后,会获取对应模块的UUID。符号表还原平台,根据这个UUID来检索对应的符号表文件。

示例一:Android Native堆栈中,包含UUID信息,还原系统通过UUID来检索符号表。

Android 中的UUID

示例二:iOS的异常中,crash.log文件的Binary Images部分,包含模块地址范围与uuid,模块名的映射。

iOS 中的UUID

iOS 中的UUID

详细参考 《UUID提取指引》

6. FAQ

《符号表相关的FAQ》