.NET -- 使用Dump文件分析异常

article/2025/8/31 15:29:33

目录

1. Dump文件

2. 程序崩溃时自动生成Dump文件

2.1 注册表生成

2.2 代码生成

3. 手动生成Dump文件

3.1 任务管理器生成

3.2 VS生成

4. Dump文件调试分析

4.1 简易崩溃测试代码

4.2 VS2022调试

4.3 非本机测试


1. Dump文件

Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。主要是用来在系统中出现异常或者崩溃的时候来生成dump文件,然后用调试器进行调试,这样就可以快速定位到程序崩溃位置,对问题进行排查。

2. 程序崩溃时自动生成Dump文件

2.1 注册表生成

Win + R 输入regedit打开注册表

找到如下项:

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

 新建如下:

​ 

说明:

DumpCount: 文件数量      ( 值设为0即禁用此功能)
DumpFolder:存储位置    (Dump文件名:(应用程序名称全称.进程号.dmp))
DumpType:   dmp文件类型  (1:mini 2:full)

                        mini:只包含某个线程和部分模块的信息。

                        full: 包含了某个进程完整的地址空间数据,以及许多用于调试的信息 

2.2 代码生成

使用win32 api :MiniDumpWriteDump  实现

封装了DumpHelper类

using System.Runtime.InteropServices;namespace DumpTest
{public class DumpHelper{[Flags]public enum DumpType : uint{// From dbghelp.h:MiniDumpNormal = 0x00000000,                        //只包含调用栈相关信息MiniDumpWithDataSegs = 0x00000001,                  //包含已加载的模块的数据段信息,比如全局变量MiniDumpWithFullMemory = 0x00000002,                //包含全部可访问的内存MiniDumpWithHandleData = 0x00000004,                //包含句柄信息MiniDumpFilterMemory = 0x00000008,                  //过滤一些敏感信息,保护重建调用栈需要的信息MiniDumpScanMemory = 0x00000010,                    //扫描,以包含引用内存MiniDumpWithUnloadedModules = 0x00000020,           //包含最近被卸载的模块信息MiniDumpWithIndirectlyReferencedMemory = 0x00000040,//包含未直接引用的内存MiniDumpFilterModulePaths = 0x00000080,             //过滤某块的路径信息MiniDumpWithProcessThreadData = 0x00000100,         //包含完整的进程和线程信息MiniDumpWithPrivateReadWriteMemory = 0x00000200,    //包含页面属性为 PAGE_READWRITE 的页面MiniDumpWithoutOptionalData = 0x00000400,           //不包含可选数据MiniDumpWithFullMemoryInfo = 0x00000800,            //包含内存区信息MiniDumpWithThreadInfo = 0x00001000,                //包含线程状态信息MiniDumpWithCodeSegs = 0x00002000,                  //包含所有代码和有关的内存段MiniDumpWithoutAuxiliaryState = 0x00004000,         //关闭辅助内存收集MiniDumpWithFullAuxiliaryState = 0x00008000,        //使用所有的内存收集器MiniDumpWithPrivateWriteCopyMemory = 0x00010000,    //包含页面属性为 PAGE_WRITECOPY 的页面MiniDumpIgnoreInaccessibleMemory = 0x00020000,      //忽略不可访问的页面MiniDumpValidTypeFlags = 0x0003ffff,                //包含安全令牌相关信息};//typedef struct _MINIDUMP_EXCEPTION_INFORMATION {//    DWORD ThreadId;//    PEXCEPTION_POINTERS ExceptionPointers;//    BOOL ClientPointers;//} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;[StructLayout(LayoutKind.Sequential, Pack = 4)]  // Pack=4 is important! So it works also for x64!struct MiniDumpExceptionInformation{public uint ThreadId;public IntPtr ExceptioonPointers;[MarshalAs(UnmanagedType.Bool)]public bool ClientPointers;}//BOOL//WINAPI//MiniDumpWriteDump(//    __in HANDLE hProcess,  :要转储的进程句柄。//    __in DWORD ProcessId,  :要转储的进程ID。//    __in HANDLE hFile,     :通过 CreateFile() 等 API 打开的,用来保存 dump 的文件句柄。//    __in MINIDUMP_TYPE DumpType,  :转储类型。此参数会直接影响转储文件的大小//    __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,     :指向异常信息结构 MiniDumpExceptionInformation 的指针。如果本参数为 NULL,则转储文件中不会包含异常信息。//    __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,  :指向用户自定义信息结构的指针//    __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam        :指向回调例程 MINIDUMP_CALLBACK_INFORMATION 的指针。如果此参数为NULL,转储过程中不会执行任何回调例程。//    );[DllImport("dbghelp.dll",EntryPoint = "MiniDumpWriteDump",CallingConvention = CallingConvention.StdCall,CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]static extern bool MiniDumpWriteDump(IntPtr hProcess,uint processId,IntPtr hFile,uint dumpType,ref MiniDumpExceptionInformation expParam,IntPtr userStreamParam,IntPtr callbackParam);[DllImport("kernel32.dll", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)]static extern uint GetCurrentThreadId();[DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess", ExactSpelling = true)]static extern IntPtr GetCurrentProcess();[DllImport("kernel32.dll", EntryPoint = "GetCurrentProcessId", ExactSpelling = true)]static extern uint GetCurrentProcessId();public static bool WriteDump(string fileName){return Write(fileName, DumpType.MiniDumpNormal);}public static bool Write(string fileName, DumpType dumpType){var path = Path.Combine(Environment.CurrentDirectory, fileName);using var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None);MiniDumpExceptionInformation exp;exp.ThreadId = GetCurrentThreadId();exp.ClientPointers = false;exp.ExceptioonPointers = Marshal.GetExceptionPointers();bool bRet = MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),fs.SafeFileHandle.DangerousGetHandle(),(uint)dumpType,ref exp,IntPtr.Zero,IntPtr.Zero);return bRet;}}
}

调用:

当某个系统异常未被捕获时,调用方法生成Dump文件

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler((obj, args) => DumpHelper.WriteDump($"Error_{DateTime.Now.ToString("yyyy_M_dd_HH_mm")}.dmp")
);

结果:

代码出现异常导致程序崩溃时,会在程序的工作目录下自动生成Dump文件,如图:

文件1:DumpType:MiniDumpWithFullMemory

文件2:DumpType:MiniDumpNormal

可以看出Dump文件保存的内容不同,文件大小差异巨大。

3. 手动生成Dump文件

3.1 任务管理器生成

打开任务管理器 --> 找到对应进程 --> 右击选择创建转储文件

创建成功如图:

3.2 VS生成

在代码中断时,调试 --> 将转储另存为 --> 设置文件路径&文件名

4. Dump文件调试分析

4.1 简易崩溃测试代码

var lists=new List<string>() {"a","b","c"};
Console.WriteLine(lists[3]);

4.2 VS2022调试

运行DumpTest.exe,程序崩溃后,自动生成Dump文件

用VS打开.dmp文件

​ 

点击右侧"使用混合进行调试" -- > 就定位到异常位置,如图

 得出结论:列表引用超范围的异常

4.3 非本机测试

若将Dump文件拷贝到另一台PC上调试时,则需要将以下3个文件都拷下来,放在同一目录下,必须保证pdb与出问题的exe是同一时间生成的。

参考:

【1】 MiniDumpWriteDump function (minidumpapiset.h) - Win32 apps | Microsoft Learn

【2】Dump文件的生成和使用_思影影思的博客-CSDN博客_dump

【3】C#使用MiniDump捕获异常 - 你不知道的浪漫 - 博客园 (cnblogs.com)

【4】向大厂看齐!为自己的程序增加自动转储的功能! - 知乎 (zhihu.com)


http://chatgpt.dhexx.cn/article/tJX5ZHUe.shtml

相关文章

java heapdump 分析工具_heapdump分析工具

heapdump分析工具是一款强大的数据分析工具&#xff0c;它可以用图表的形式来展现相应的分析结果&#xff0c;在使用heapdump分析工具之前请先安装JDK1.6。 运行环境 1.运行环境要求JDK 1.6或以上 如果JDK版本过低&#xff0c;报错如下&#xff1a; Exception in thread "…

php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...

从Win8系统开始到Win10&#xff0c;蓝屏界面大变脸&#xff0c;不再显示详细的代码错误文件&#xff0c;看起来是友好多了不过对用户查找回题原因来说就麻烦不少了~好在Win8/win10 在蓝屏时会生成dump文件&#xff0c;我们可以使用专用工具进行分析解读查找到问题所在。下面小编…

Dump文件分析工具 - MAT图文解析

/ 前言 / 在讲解Mat工具之前我们先来看下几个关于Dump/文件的问题 Dump文件是什么 Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中 我们拿到Dump文件有什么用的? 假如JVM因为内存溢出的原因宕机了, 而程序的日志里面并没有关于溢出所在对象的信息…

【华为云技术分享】干货分享丨jvm系列:dump文件深度分析

摘要&#xff1a;java内存dump是jvm运行时内存的一份快照&#xff0c;利用它可以分析是否存在内存浪费&#xff0c;可以检查内存管理是否合理&#xff0c;当发生OOM的时候&#xff0c;可以找出问题的原因。那么dump文件的内容是什么样的呢&#xff1f; JVM dump java内存dump是…

Java的dump文件分析及JProfiler使用

Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上&#xff0c;dump文件就是当程序产生异常时&#xff0c;用来记录当时的程序状态信息&#xff08;例如堆栈的状态&#xff09;,用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…

获取和分析Dump的几种工具简介

最近在进一步学习support技能的时候&#xff0c;了解到分析Dump的重要性&#xff0c;经过学习&#xff0c;做一些笔记。 一、什么是Dump文件。 Dump文件时进程的内存镜像。可以把程序的执行状态保存到Dump文件中。Dump文件分为内核模式Dump和用户模式Dump。其中内核模式Dump是…

JVM-通过MAT工具对dump文件进行分析

文章目录 MAT工具介绍下载安装使用OverviewHistogramDominator_TreeOQLThread_OverviewLeak Suspects MAT工具介绍 MAT(Memory Analyzer Tool)&#xff0c;一个基于Eclipse的内存分析工具&#xff0c;是一个快速、功能丰富的JAVA heap分析工具&#xff0c;它可以帮助我们查找内…

错误号码2058:Plugin caching sha2_password could not be loaded

安装SQLyog之后&#xff0c;新建接口&#xff0c;输入密码&#xff0c;点击连接&#xff0c;发现出现了如下的错误&#xff1a; 1.错误的原因 SQLyog加密方式出现了错误&#xff0c;这时由于 插件缓存——sha2_密码无法进行加载所导致的。 2.解决方法 在开始菜单中输入命令…

2023/06/28

文章目录 1.export和export default的区别2.npm和cnpm的区别3.npm run dev/serve的区别4.slice、splice和split的区别 1.export和export default的区别 模块功能主要由两个命令构成&#xff1a;export和import。export命令用于规定模块的对外接口&#xff0c;import命令用于输…

02.07 SQLyog连接MySQL数据库时报2058错误(转载)

使用SQLyog连接MySQL时报了这样一个错 “错误号码2058&#xff0c;Plugin caching——sha2_passward could not be loaded:******** ”(乱码) 将报错信息翻译&#xff1a;“插件缓存——sha2_密码无法进行加载”&#xff0c;这是由于你的SQLyog mysql 密码加密方法变了&#…

【C++】2058:【例3.10】简单计算器(信息学奥赛)

好了&#xff0c;今天的内容就是有简单计算器了&#xff0c;内容的详细意思也就是一个最简单的计算器支持&#xff0c;-&#xff0c;*&#xff0c;/四种运算然后根据输入输出结果。&#xff08;博主正在冲200粉丝&#xff0c;喜欢的赶紧关注&#xff01;&#xff01;&#xff0…

【MySQL2058】MySQL远程连接错误码2058

Docker安装的MySQL&#xff0c;突然服务器登录正常&#xff0c;但是使用SQLyog登录报异常&#xff1a; MySQL错误号码 2058上网上巴拉巴拉半天&#xff0c;各种说法都有&#xff0c;最后综合网上各种教程方案&#xff0c;解决了自己的问题&#xff0c;最后将自己的解决方案罗列…

解决SQLyog连接MySQL出现2058错误

解决SQLyog连接MySQL出现2058错误 1、确定你的mysql命令能运行&#xff0c;像下面这样&#xff1a; 2、如果出现这种情况&#xff1a; 解决方法一&#xff1a; 配置系统环境变量path的值&#xff0c;将安装MySQL路径下的bin路径&#xff1a;MySQL安装目录\bin&#xff0c;配置…

SQLyog连接数据库报错2058

命令符界面登录MySQL然后输入命令 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码; 修改密码的加密方式即可。

使用sqlyog连接数据库时出现错误(2058)解决方法

出现这个原因是MySQL8之前的版本中加密规则是mysql_native_password&#xff0c;而在MySQL8之后&#xff0c;加密规则 是caching_sha2_password。解决问题方法有两种&#xff1b; &#xff08;1&#xff09;第一种是升级图形界面工具版本 &#xff08;2&#xff09;第二种是把M…

SQLyog出现2058错误的解决方法

① WinR打开终端&#xff0c;输入cmd ②输入 mysql -u root -p 然后输入密码 &#xff08;root&#xff09; ③依次执行以下语句 ALTER USER’root’‘localhost’ IDENTIFIED BY ‘root’ PASSWORD EXPIRE NEVER; #修改加密规则 ALTER USER’root’‘localhost’ IDENTIFIED…

使用sqlyog连接mysql时出现错误号码2058的解决方法

1、使用命令行&#xff08;winR --> cmd&#xff09;登录mysql&#xff0c;需要输入密码&#xff1b;若出现如下界面&#xff0c;登录成功。 2、输入 use mysql&#xff1b;&#xff08;分号要有&#xff09; 3、输入 select user,host from user; 出现如下界面。 4、从上…

SQLyog连接MySQL8.0.24远程服务器 ,报错:2058的解决方法

写在前面&#xff1a; 我热爱技术&#xff0c;热爱分享&#xff0c;热爱生活&#xff0c; 我始终相信&#xff1a;技术是开源的&#xff0c;知识是共享的&#xff01; 博客里面的内容大部分均为原创&#xff0c;是自己日常的学习记录和总结&#xff0c;便于自己在后面的时间里回…

sqlyog连接mysql错误码2058

一、⾸先保证你的MySQL数据库安装成功 cmd命令下mysql -u root -p 连接出错如上&#xff0c;原因是加密⽅式变了&#xff0c;现在是root的授权没刷新&#xff0c;我们重置⼀下密码。sqlyog配置新连接报错&#xff1a;错误号码2058&#xff0c;是因为mysql密码加密⽅法变了。 …

SQLyog连接mysql8.0时报错(错误号码2058)

本文将详细说明解决SQLyog连接mysql8.0时&#xff0c;SQLyog Ultimate显示报错信息并附带乱码&#xff1a;“错误号码2058&#xff0c;Plugin caching——sha2_passward could not be loaded:******** ”(最后一段信息是乱码)。 如下图所示&#xff1a; 将报错信息翻译过来就是…