如何在.NET程序崩溃时自动创建Dump?( 二 )

  • 4: Full 最大的转储,包含所有内存(包括模块映像) 。
  • 【如何在.NET程序崩溃时自动创建Dump?】一般情况下,我们会配置下面的环境变量:
    DOTNET_DbgEnableMiniDump = 1DOTNET_DbgMiniDumpName = [有权限的Path目录]DOTNET_CreateDumpDiagnostics = 1DOTNET_EnableCrashReport = 1试一试我们写一段代码来试一把,如下有一段代码首先输出了当前DTONET_前缀对的环境变量,然后抛出一个异常 。
    using System.Collections;foreach (DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables()){if(environmentVariable.Key.ToString()?.StartsWith("DOTNET_") == false) continue;Console.WriteLine($"{environmentVariable.Key}={environmentVariable.Value}");}throw new Exception("Crash");然后编写一个run.bat脚本,用于设置环境变量顺便启动我们的程序 。
    @SET DOTNET_DbgEnableMiniDump=1@SET DOTNET_DbgMiniDumpName="G:\Temp\CrashDump\CrashDump\bin\Debug\net6.0\dump.dmp"@SET DOTNET_CreateDumpDiagnostics=1@SET DOTNET_EnableCrashReport=1@CrashDump.exe运行run.bat可以看到环境变量正确的读到了,另外也成功的生成了Dump 。
    如何在.NET程序崩溃时自动创建Dump?

    文章插图
    最后在对应的目录下,也生成了Dump文件 。
    如何在.NET程序崩溃时自动创建Dump?

    文章插图
    如果是在容器环境中的话,直接修改Dockerfile即可,如下所示的那样:
    如何在.NET程序崩溃时自动创建Dump?

    文章插图
    如果在容器环境中,DOTNET_DbgMiniDumpName需要配置映射到Host的目录 , 不然容器退出,Dump文件也会随之消失 。
    总结本文主要是介绍了如何在dotNet程序崩溃时自动创建Dump , Windows上的方法对于.NET Freamwork和.NET Core版本都适用 。.NET Core全平台版本的话需要注意环境变量支持的.NET版本 。
    参考文献
    • https://learn.microsoft.com/en-us/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-3-capture-core-crash-dumps
    • https://www.meziantou.net/tip-automatically-create-a-crash-dump-file-on-error.htm
    • https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/botr/xplat-minidump-generation.md

    推荐阅读