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

这篇具有很好参考价值的文章主要介绍了在.NET程序崩溃时自动创建Dump的思路详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

c# 应用程序挂掉生成dump,实战分享,windows,.NET

 

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

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

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

Windows平台

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

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

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

关于DOTNET_DbgMiniDumpType的说明如下所示:

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

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。

  • 打开regedit.exe

  • 打开目录HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

  • 创建KEYDumpFolder类型为REG_EXPAND_SZ用于配置存放Dump文件的目录

  • 另外可以创建KEYDumpCount类型为REG_DWORD配置Dump的总数量

  • c# 应用程序挂掉生成dump,实战分享,windows,.NET

    当然也可以使用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。如下图所示:

    c# 应用程序挂掉生成dump,实战分享,windows,.NET

     

    .NET Core全平台

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

  • COMPlus_DbgEnableMiniDumpDOTNET_DbgEnableMiniDump: 如果设置为 1,则发生故障时启用CoreDump生成。默认值为:0

  • COMPlus_DbgMiniDumpTypeDOTNET_DbgMiniDumpType: 要收集的转储类型。 有关详细信息,请看下文的说明。默认值为:2

  • COMPlus_DbgMiniDumpNameDOTNET_DbgMiniDumpName: 写入转储的文件路径。 确保运行 dotnet 进程的用户具有指定目录的写入权限。默认值为:/tmp/coredump.<pid>

  • COMPlus_CreateDumpDiagnosticsDOTNET_CreateDumpDiagnostics: 如果设置为 1,则启用转储进程的诊断日志记录。默认值为:0

  • COMPlus_EnableCrashReportDOTNET_EnableCrashReport:(需要.NET 6 或更高版本,目前仅Linux和MacOS可用)如果设为 1,运行时会生成 JSON 格式的故障报表,其中包括有关故障应用程序的线程和堆栈帧的信息。 故障报表名称是追加了 .crashreport.json 的转储路径/名称。

  • COMPlus_CreateDumpVerboseDiagnosticsDOTNET_CreateDumpVerboseDiagnostics:(需要 .NET 7 或更高版本)如果设为 1,则启用转储进程的详细诊断日志记录。

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

  • 1:Mini小型Dump,其中包含模块列表、线程列表、异常信息和所有堆栈。

  • 2:Heap大型且相对全面的Dump,其中包含模块列表、线程列表、所有堆栈、异常信息、句柄信息和除映射图像以外的所有内存。

  • 3:TriageMini相同,但会删除个人用户信息,如路径和密码。

  • 4:Full最大的转储,包含所有内存(包括模块映像)。

  • c# 应用程序挂掉生成dump,实战分享,windows,.NET

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

  • c# 应用程序挂掉生成dump,实战分享,windows,.NET 

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

  • c# 应用程序挂掉生成dump,实战分享,windows,.NET 

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

    总结

    本文主要是介绍了如何在dotNet程序崩溃时自动创建Dump,Windows上的方法对于.NET Freamwork和.NET Core版本都适用。.NET Core全平台版本的话需要注意环境变量支持的.NET版本。文章来源地址https://www.toymoban.com/news/detail-802627.html

到了这里,关于在.NET程序崩溃时自动创建Dump的思路详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C#】通过C#代码创建IIS应用程序池和网站

    代码 参考了其他人的代码,做了一些优化,很多代码用不上 例子 参考 自写C#添加网站应用程序池虚拟目录实现网站管理 » 江湖人士 使用命令行在 Windows 11 上启用 IIS Web 服务器-云东方 用C# 代码咋管理IIS呢?_零零妖的博客-CSDN博客 C#IIS网站应用程序池列表添加修改删除 - -

    2024年02月13日
    浏览(43)
  • C#【自动化测试】对Windows桌面应用程序进行UI自动化测试

    本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试。 所谓UI自动化测试,就是 模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试 。 要对Windows桌面应用程序进行UI自动化测试,目前可选的技术主要是两种: VS自带的CodedUI Test和Appium+WinApp

    2024年01月15日
    浏览(61)
  • C# Asp.Net6 MVC,Log4net NLog 日志插件应用 及Windows、Liux环境下程序发布

    connected Services 服务依赖(第三方) Properties 文件下 launchSettings.json 项目启动配置文件 wwwroad 存放静态文件 依赖项 管理Nuget程序包 appsettings.json 配置文件 C 业务逻辑运算–调用其他的服务做业务逻辑 M 实体对象,保存数据,数据传输 V 视图,表现层 第一步:寻找log4net 程序包

    2024年02月14日
    浏览(51)
  • 【Visual Studio 2022创建ASP.NET Web应用程序(.NET Framework)发布并部署到局域网 及“常见权限问题和不列出目录问题解决”】

    然后给项目命名并选择文件保存位置 用一个空项目进行举例 创建完成如下 点击更多模板选择Web窗体 创建成功如下 .aspx页面编写前端代码,.aspx.cs页面编写后端代码 通过插入表格和拉取控件快速完成 然后给Button按钮设置一个点击事件,双击按钮后会跳到.aspx.cs页面,完善下面

    2024年02月07日
    浏览(77)
  • C# 利用 UI 自动化框架与应用程序的用户界面进行交互来模拟点击按钮

    ①需要引入命名空间: using System.Windows.Automation; ②添加两个引用: UIAutomationClient、UIAutomationTypes 当程序已经启动时, AutoClickLoginButton 方法会寻找名为\\\"FR\\\"的应用程序进程。然后,它使用 AutomationElement.FromHandle 从该进程的主窗口句柄获取根元素。 接着, FindLoginButton 方法被调用

    2024年01月25日
    浏览(77)
  • 记一次应用程序池崩溃问题分析

    IIS部署的asp.net core服务,前端进行一些操作后,经常需要重新登陆系统。 根据日志,可以看到服务重新进行了初始化,服务重启应该与IIS应用程序池回收有关,查看IIS相关日志,在windows的事件查看器=Windows日志=系统,来源为WAS的日志(参考博客)。 根据IIS日志与服务日志对比

    2024年02月04日
    浏览(46)
  • Python 创建 Web 应用程序和用户界面库之flexx使用详解

    Flexx 是一个强大的 Python 库,用于创建交互式的 Web 应用程序和用户界面。它提供了灵活的组件和布局管理器,使开发者可以轻松构建具有丰富交互性和动态性的应用。本文将详细介绍 Flexx 库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。 Flexx 是一个基于

    2024年04月17日
    浏览(67)
  • Linux下ROS程序崩溃,程序段错误process has died [pid 20083, exit code -11, cmd /home GDB core dump 调试

           在Linux下可通过core文件来获取当程序异常退出(如异常信号SIGSEGV, SIGABRT等)时的堆栈信息。 core dump叫做核心转储 ,当程序运行过程中发生异常的那一刻的一个内存快照,操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态

    2024年02月12日
    浏览(47)
  • Electron打包的桌面应用程序,运行中程序黑屏、白屏等渲染进程崩溃问题解决

    使用 Electron 打包 web 项目为桌面应用程序,由于运行环境的硬件条件或其他一些原因,导致程序运行过程中黑屏、白屏、崩溃。 2.1 依赖版本: electron : v8.2.1 electron-log : v4.1.1 electron-packager : v14.2.1 2.2 运行环境 win7 x86 2.3 分析过程 2.3.1 排除 程序本身运行不会“白屏”,但运行

    2024年02月07日
    浏览(52)
  • windows11 出现SearchHost.exe应用程序崩溃事件原因分析

    3月15日之后,点击搜索框的时候总是卡顿,点不开,查看系统事件,发现系统出现上万条的SearchHost.exe事件。参照微软网站上的回复,重建了索引,重装了应用都不能解决问题。鉴于之前没有出现过这个问题,于是把最近安装的软件全部卸载,依然没解决问题。 最后怀疑是系

    2024年02月11日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包