架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2231|回复: 1

[.NET Core] 【实战】.NET/C# 应用崩溃异常退出自动生成 DMP 转储文件

[复制链接]
发表于 2022-11-6 22:41:42 | 显示全部楼层 |阅读模式
需求:在使用 .NET/C# 开发应用程序时,任何开发者都不可能保证程序稳定健壮的执行,这可能和开发者的代码逻辑有关系,也可能和用户的运行环境有关系,也就是都无法 100% 保证自己所开发出的应用程序没有任何问题,有问题并不可怕,可怕的是有问题无法找出原因,无法去解决问题。

如果开发的应用程序没有按预期执行导致发生异常退出,如何自动生成 DMP 转储文件,方便排查问题呢?
转储是一种文件,其中包含创建进程时该进程的快照,可用于检查应用程序的状态。 当很难将调试程序附加到 .NET 应用程序(如生产或 CI 环境)时,可使用转储来调试该应用程序。 使用转储可以捕获有问题进程的状态,并且可以直接检查状态而无需停止应用程序。

收集转储

可以使用环境变量将应用程序配置为在发生故障时收集转储。 如果想要了解故障原因,这将很有帮助。 例如,在引发异常时捕获转储有助于通过在应用发生故障时检查应用状态来确定问题。

下表显示了可用于将应用程序配置为在发生故障时收集转储的环境变量。

环境变量
说明
默认值
COMPlus_DbgEnableMiniDump 或 DOTNET_DbgEnableMiniDump如果设置为 1,则启用核心转储生成。0
COMPlus_DbgMiniDumpType 或 DOTNET_DbgMiniDumpType要收集的转储类型。 有关详细信息,请参阅下表2 (MiniDumpWithPrivateReadWriteMemory)
COMPlus_DbgMiniDumpName 或 DOTNET_DbgMiniDumpName写入转储的文件路径。 确保运行 dotnet 进程的用户具有指定目录的写入权限。/tmp/coredump.<pid>
COMPlus_CreateDumpDiagnostics 或 DOTNET_CreateDumpDiagnostics如果设置为 1,则启用转储进程的诊断日志记录。0
COMPlus_EnableCrashReport 或 DOTNET_EnableCrashReport(需要 .NET 6 或更高版本)如果设为 1,运行时会生成 JSON 格式的故障报表,其中包括有关故障应用程序的线程和堆栈帧的信息。 故障报表名称是追加了 .crashreport.json 的转储路径/名称。
COMPlus_CreateDumpVerboseDiagnostics 或 DOTNET_CreateDumpVerboseDiagnostics(需要 .NET 7 或更高版本)如果设为 1,则启用转储进程的详细诊断日志记录。0
COMPlus_CreateDumpLogToFile 或 DOTNET_CreateDumpLogToFile(需要 .NET 7 或更高版本)应写入诊断消息的文件路径。 如果未设置,则将诊断消息写入故障应用程序的控制台。

对于这些环境变量,.NET 7 标准化前缀 DOTNET_,而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀



新建 .NET Core 6 应用测试

使用 VS 2022 新建一个 .NET Core 6 应用测试进行测试,代码如下:

使用 cmd 命令启动程序,如下图:

COMPlus_EnableCrashReport=1
COMPlus_DbgEnableMiniDump=1
COMPlus_DbgMiniDumpName="C:\Users\itsvse_pc\AppData\Local\Temp\NET\test.dmp"
COMPlus_CreateDumpDiagnostics=1
Unhandled exception. System.Exception: itsvse.com
   at Program.<Main>$(String[] args) in C:\Users\itsvse_pc\source\repos\WindowsFormsApp1\DumpDemo\Program.cs:line 9
[createdump] Writing minidump with heap to file C:\Users\itsvse_pc\AppData\Local\Temp\NET\test.dmp
[createdump] Dump successfully written

QQ截图20221106223426.jpg

可以看到程序异常崩溃后,成功在我们指定目录下面生成了转储 .dmp 文件,至于如何分析,就是另外一码事了。

Windows 平台通用设置

在 Windows 中,可以将 Windows 错误报告 (WER) 配置为在应用程序崩溃时生成转储。

这个方式对所有程序都有效果,不仅仅是.NET程序,如C++、Go等等都可以;而且和.NET、.NET Core版本无关

  • 打开regedit.exe
  • 打开目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
  • 创建KEY DumpFolder 类型为REG_EXPAND_SZ用于配置存放Dump文件的目录
  • 另外可以创建KEY DumpCount 类型为REG_DWORD配置Dump的总数量


QQ截图20221106223854.jpg

当然也可以使用PowerShell命令来配置这些:

按照上面的配置,如果程序发生了异常退出,那么就会在%LOCALAPPDATA%\CrashDumps目录创建程序的Dump。

参考资料:

https://learn.microsoft.com/zh-cn/dotnet/core/diagnostics/dumps
https://www.cnblogs.com/InCerry/p/how_to_automic_create_dump_when_app_crash.html
https://learn.microsoft.com/zh-cn/troubleshoot/developer/webapps/aspnetcore/practice-troubleshoot-linux/lab-1-3-capture-core-crash-dumps




上一篇:Discuz 附件图片、头像图片、相册图片存储规则详解
下一篇:【实战】使用 BundleTransformer 替换 System.Web.Optimization
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2022-11-6 22:44:06 | 显示全部楼层
发送转储文件:

程序启动后,判断目录是否有生成的转储文件,如果存在的话,将文件提交到指定接口,然后删除该文件。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-20 21:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表