导航

【Unity】使用dmp文件定位Player崩溃原因

Posted on 2022-04-30 22:35  Caiger  阅读(4484)  评论(1编辑  收藏  举报

写在前面

  • 如果在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。