在.NET程序崩溃时自动创建Dump的思路详解

 更新时间:2022年11月02日 17:05:54   作者:InCerry  
本文主要是介绍了如何在dotNet程序崩溃时自动创建Dump,Windows上的方法对于.NET Freamwork和.NET Core版本都适用,.NET Core全平台版本的话需要注意环境变量支持的.NET版本,对.net程序崩溃自动创建Dump相关知识感兴趣的朋友一起看看吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

今天在浏览张队转载文章的留言时,遇到一个读者问了这样的问题,如下图所示:

首先能明确的一点是"程序崩溃退出了是不能用常规的方式dump的",因为整个进程树都已经退出。现场已经无法使用常规的方式读取到。

一般来说常规的方法是没办法读取到的,也有一些特殊的方式,比如有关部门在调查取证时,就可以通过一些工具读取到内存中的信息。当然这是一些hack手段,不在本文讨论中。

不过好消息是,虽然您无法在程序崩溃退出以后创建Dump,但是您可以在程序崩溃时自动创建Dump,这样下次遇到程序崩溃,那么就可以有分析的现场了。

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的总数量

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

New-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting" -Name "LocalDumps"

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpFolder" -Value "%LOCALAPPDATA%\CrashDumps" -PropertyType ExpandString

New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" -Name "DumpCount" -Value 10 -PropertyType DWord

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

.NET Core全平台

那么如果您是.NET Core跨平台应用,那么在Linux、MacOS等操作系统上,有更简单和更丰富的方式,下方有一些环境变量的参数:

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

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

关于DOTNET_DbgMiniDumpType的说明如下所示:

  • 1: Mini 小型Dump,其中包含模块列表、线程列表、异常信息和所有堆栈。
  • 2: Heap 大型且相对全面的Dump,其中包含模块列表、线程列表、所有堆栈、异常信息、句柄信息和除映射图像以外的所有内存。
  • 3: Triage 与 Mini 相同,但会删除个人用户信息,如路径和密码。
  • 4: Full 最大的转储,包含所有内存(包括模块映像)。

一般情况下,我们会配置下面的环境变量:

DOTNET_DbgEnableMiniDump = 1
DOTNET_DbgMiniDumpName = [有权限的Path目录]
DOTNET_CreateDumpDiagnostics = 1
DOTNET_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。

最后在对应的目录下,也生成了Dump文件。

如果是在容器环境中的话,直接修改Dockerfile即可,如下所示的那样:

如果在容器环境中,DOTNET_DbgMiniDumpName需要配置映射到Host的目录,不然容器退出,Dump文件也会随之消失。

总结

本文主要是介绍了如何在dotNet程序崩溃时自动创建Dump,Windows上的方法对于.NET Freamwork和.NET Core版本都适用。.NET Core全平台版本的话需要注意环境变量支持的.NET版本。

参考文献

到此这篇关于如何在.NET程序崩溃时自动创建Dump的文章就介绍到这了,更多相关.net程序崩溃自动创建Dump内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • ASP.NET Internet安全Forms身份验证方法

    ASP.NET Internet安全Forms身份验证方法

    安全性是 ASP.NET Web 应用程序中一个非常重要的方面,它涉及内容非常广泛,不能在一篇文章内说明所有的安全规范,本文讲述如何利用IIS以及Forms 身份验证构建安全的 ASP.NET 应用程序,它是目前被使用最多最广的验证/授权方式.
    2009-12-12
  • asp.net中for和do循环语句用法分享

    asp.net中for和do循环语句用法分享

    文章介绍了两个实例一个是FOR循环创建一个Mandelbrot图像,循环结构之DO语句,根据布尔值的测试结果,执行相应代码,有需要的朋友可参考一下
    2012-04-04
  • ASP.NET?Core?MVC缓存Tag?Helpers到内存

    ASP.NET?Core?MVC缓存Tag?Helpers到内存

    这篇文章介绍了ASP.NET?Core?MVC缓存Tag?Helpers到内存的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • Ajax实现异步刷新验证用户名是否已存在的具体方法

    Ajax实现异步刷新验证用户名是否已存在的具体方法

    由于要做一个注册页面,看到许多网站上都是使用Ajax异步刷新验证用户名是否可用的,所以自己也动手做一个小实例
    2014-02-02
  • 正则表达式速查表(ASP.NET)

    正则表达式速查表(ASP.NET)

    正则表达式速查表 ASP.NET,学习正则表达式的朋友可以参考下
    2012-03-03
  • 基于nopCommerce的开发框架 附源码

    基于nopCommerce的开发框架 附源码

    这篇文章主要为大家详细介绍了基于nopCommerce的开发框架,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Nginx配置实现下载文件的示例代码

    Nginx配置实现下载文件的示例代码

    这篇文章主要介绍了Nginx配置实现下载文件的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 对ASP.Net的WebAPI项目进行测试

    对ASP.Net的WebAPI项目进行测试

    这篇文章介绍了对WebAPI项目进行测试的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)

    asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)

    通过HTTP模拟GET或POST请求,提交数据到服务端获取响应,比较常见些;但如上传文件到服务端,使用html form当然简单了,而因环境所限有时需要使用模拟方法去提交有附件(文件上传)的表单。
    2010-02-02
  • ASP.NET实现根据URL生成网页缩略图的方法

    ASP.NET实现根据URL生成网页缩略图的方法

    这篇文章主要介绍了ASP.NET实现根据URL生成网页缩略图的方法,结合实例较为详细的分析了asp.net生成网页缩略图的详细实现技巧与相关注意事项,需要的朋友可以参考下
    2015-11-11

最新评论

?


http://www.vxiaotou.com