符号表
1. 什么是符号表?
对于不同平台来说,符号表的意义略有差异。对于Android平台来说,包含两类符号表,一类是SO的符号表,另一类是Java的mapping文件。对于iOS平台来说,符号表指dSYM文件。无论是哪类符号表,其目的都是将混淆后的堆栈进行还原,还原成开发可读的文件名、方法名及行号。
示例1: Android Java堆栈还原
示例2: Android Native堆栈还原
示例3: iOS 堆栈还原
详细请查看各平台的符号表介绍:
2. 怎样上传符号表?
当前Bugly支持两种符号表上传方式,一种是通过网页上传,另一种是通过符号表工具上传。
方式一:网页上传
详细见 《网页上传符号表》
方式二:符号表工具上传
详细见 《符号表上传工具》
3. 怎样管理符号表?
用户可以在 设置/符号表 查看当前产品的符号表信息。
查看指定的符号表是否已经上传;
上传符号表;
查看产品符号表的整体情况;
重新上传指定符号表文件;
详细参考:
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来检索符号表。
示例二:iOS的异常中,crash.log文件的Binary Images部分,包含模块地址范围与uuid,模块名的映射。
详细参考 《UUID提取指引》