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

:(需要 .NET 7 或更高版本)应写入诊断消息的文件路径 。如果未设置,则将诊断消息写入故障应用程序的控制台 。

对于这些环境变量,.NET 7 标准化前缀 DOTNET_,而不是 COMPlus_ 。但是,COMPlus_ 前缀仍将继续正常工作 。如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀 。
关于DOTNET_DbgMiniDumpType的说明如下所示:
  • 1: Mini 小型Dump,其中包含模块列表、线程列表、异常信息和所有堆栈 。
  • 2: Heap 大型且相对全面的Dump,其中包含模块列表、线程列表、所有堆栈、异常信息、句柄信息和除映射图像以外的所有内存 。
  • 3: Triage 与 Mini 相同,但会删除个人用户信息,如路径和密码 。
  • 4: Full 最大的转储,包含所有内存(包括模块映像) 。
一般情况下,我们会配置下面的环境变量:
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

经验总结扩展阅读