Unity线上错误解析工具的使用
Unity Dashboard或者Firebase Crashlytic上时常会出现一些看不懂的错误Log,目前我们能够解析的有两类错误。
- libunity错误(例:libunity.0x73e900)
- libil2cpp错误(例:libil2cpp.0x16b3008)
之所以错误后面显示一大堆数字是因为这些数字是符号表地址。如果平台没有拿到你的符号表,它是无法找到对应语句的,所以只能给你直接显示地址。
那么符号表在哪里呢?
以Anrdoid为例,打包的时候我们在Build Setting里面选择Create symbols.zip选项,打出的包的根文件夹同级目录里面就会出现符号表的压缩包。解压后就会看到两个架构对应的符号表so文件。
之后我们则可以用以下语句来从符号表文件中找到地址对应的语句:
语法
arm-linux-androideabi-addr2line -f -C -e so的地址 错误地址
例子
arm-linux-androideabi-addr2line -f -C -e /Users/zyf/Desktop/symbols/armeabi-v7a/libunity.sym.so 0x2c7698
注意crash log产生的app版本要和符号表对应app版本相同,否则就会得到错误结果。
不过一条条的查效率不高,所以我们可以借助工具来进行批量查找。这一步需要在Untiy中安装Android Logcat插件。这个插件可在Window > Package Manager中安装。
然后通过Window-Analysis-Anrdoid Logcat打开。
进入Tools-Stacktrace Utility即可到达批量解析界面。
将所有的错误栈信息Log复制到Original中,点击Resolve Stacktraces即可在Resolved里看到解析结果。
如果不好使的话:
Configure Symbol Patths 可以选择符号文件。
Configure Regex-Stacktrace Regex里面可以选择我们匹配错误的正则表达式。
从这里我们也可以看出来这个工具的运行原理了。即从错误栈信息中按着正则表达式提取出库名和符号表地址,然后拿到符号表里去匹配,再把结果显示出来。