写在前面
- 如果在Player运行时突然崩溃,仅靠Player.log日志文件不能定位引起崩溃的代码,那么可以尝试利用dmp(仅限Windows平台)文件定位崩溃原因。
正文
环境
- Unity 2020.3.21f1 (64-bit),IL2CPP后端,Windows平台。
- Visual Studio 2019
先让Unity崩溃
- 想要得到dmp文件,必须先让Unity崩溃。我的测试设计很简单,场景有一个按钮,点了按钮就会让Unity崩溃。场景效果如下图:
按钮的代码TestCrash.cs如下(参考链接:“怎样能够强制Unity应用Crash”),我在ClickCrash方法中写了强制崩溃:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Diagnostics; public class TestCrash : MonoBehaviour { public void ClickCrash() { UnityEngine.Debug.LogFormat($"<color=yellow>ForceCrash</color>"); Utils.ForceCrash(ForcedCrashCategory.FatalError); } }
在编辑器上,Unity的表现是突然卡住,然后弹出向Unity官方发送报错的窗口,关闭这个窗口后编辑器也会被关闭。
利用dmp文件定位崩溃代码
- 编辑器上可以成功崩溃后就打Player,如下图,BuildSetting窗口务必要勾上Development Build,再勾上Deep Profiling Support,不然即使得到dmp文件也无法具体定位。
打出的Player文件夹内容如下图,这里我的Player叫2019TestMisc.exe。
顺便一提,我在Assembly-CSharp4.cpp里找到了我写的测试代码。
运行2019TestMisc.exe,能正常崩溃,这里的表现也是突然卡住,然后弹出向Unity官方发送报错的窗口,关闭这个窗口后2019TestMisc.exe也会被关闭。
UnityManual有介绍在哪里可以看Crash文件,我的Crash文件夹路径如下图:
打开文件夹就能看到crash.dmp文件和Player.log。
UnityManual有调试说明,这里我用Vs打开crash.dmp文件,如下图,它长这样:
我按照调试说明设置了符号路径,如下图,为了能尽快定位崩溃,我在“自动符号加载首选项”里选了“加载除排除模块之外的所有模块”。
开始调试,调试结果如下图,能看到它会定位到一个C++文件,调用堆栈窗口里能看到引起崩溃的具体脚本TestCrash和方法ClickCrash。