目前做的项目是基于unity把场景导出为一个lib,view嵌入到android中运行。

有一次遇到了个应用crash的问题,看日志是挂在了unity里边。

image.png

unity项目导出到android平台后,jni层一般会有三个so库,其中 libmain.so、libunity.so 为引擎库,libil2cpp.so 是导出模块在编译业务代码后打包的库。

一般情况下,挂在 libil2cpp.so 中的问题都比较好排查。

而如上图的,挂在引擎库内部的问题,一个是符号丢失,另一个是问题一般藏的比较深,且无源码不好排查。
源码是需要花钱买的,符号丢失的问题有方案解决,这里记录一下。

addr2line工具

首先打开ndk目录下的ndk/${version}/toolchains目录,可以看到各个平台的ndk交叉编译器工具
image.png
进入目标平台目录,然后进入 prebuilt/${指令集版本}/bin 目录,找到 addr2line 工具。
image.png

导出带符号的引擎库文件

打开 File → Build Settings, 将 Create Symbols.zip 选项设置为 debugging。
image.png

然后导出项目,即可在 unityLibrary/symbols/${指令集}/ 目录下看到带符号的引擎库。

image.png

查看crash堆栈对应的内容

查看开头错误堆栈的地址信息,运行

1
./aarch64-linux-android-addr2line -f -C -e /your-path-to/libunity.so 0000000000353e80 00000000003541f4 0000000000356480

即可看到正确的符号。
image.png

虽然没有源码,但是这里已经可以合理猜测,是调用 windowFocusChanged 的时候,释放某个 context 对象导致的 crash。

下面在 android 业务代码中再进行排查,比如 activity 是否已经释放,等思路。

☞ 参与评论