Bugly 上显示的崩溃,刚打开时完全看不懂是什么函数、什么堆栈。以下是我逐步缩小范围、最终定位问题的过程。
- 最初想到的是为 il2cpp 生成符号文件后上传到 Bugly,但找了一大圈,根本没有 il2cpp 的符号文件。debug 版本的代码和 release 差异太大,毫无参考价值。
- 退一步说,就算找到了符号表,il 代码转成 cpp 代码之后依然很难看懂,这条路基本走不通。
- 于是改变思路,根据堆栈尝试手动还原现场。由于报的是内存错误,首先怀疑无效指针或大块内存分配失败。方法是主动制造崩溃,然后对比 Bugly 的堆栈信息是否吻合——吻合则证明调用堆栈定位正确,后续排查就有了方向。
- 崩溃堆栈起始是
_pthread_startXXXX,基本可以断定问题出在我们自己开的线程里;如果是 Unity 主线程崩溃,起始通常会是UnityMain。 - 代码里只有网络部分用了自开线程,因此重点审查该部分代码。逐个可能引发内存错误的代码块插入下面的测试代码,依次验证:
var x = new byte[1024*1024*1024]