c# 如何让应用程序崩溃时生成dump

news/2025/1/15 15:23:54/

在代码中手动生成Dump文件

研究了一下,可以通过代码在应用崩溃或捕获特定异常时,手动生成dump文件。常用的是调用Windows的MiniDumpWriteDump API。可以使用P/Invoke调用该函数,具体步骤如下:

导入必要的Windows API

using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;class MiniDump
{[Flags]public enum MiniDumpType{MiniDumpNormal = 0x00000000,MiniDumpWithDataSegs = 0x00000001,MiniDumpWithFullMemory = 0x00000002,MiniDumpWithHandleData = 0x00000004,MiniDumpFilterMemory = 0x00000008,MiniDumpScanMemory = 0x00000010,MiniDumpWithUnloadedModules = 0x00000020,MiniDumpWithIndirectlyReferencedMemory = 0x00000040,MiniDumpFilterModulePaths = 0x00000080,MiniDumpWithProcessThreadData = 0x00000100,MiniDumpWithPrivateReadWriteMemory = 0x00000200,MiniDumpWithoutOptionalData = 0x00000400,MiniDumpWithFullMemoryInfo = 0x00000800,MiniDumpWithThreadInfo = 0x00001000,MiniDumpWithCodeSegs = 0x00002000,MiniDumpWithoutAuxiliaryState = 0x00004000,MiniDumpWithFullAuxiliaryState = 0x00008000,MiniDumpWithPrivateWriteCopyMemory = 0x00010000,MiniDumpIgnoreInaccessibleMemory = 0x00020000,MiniDumpWithTokenInformation = 0x00040000}[DllImport("dbghelp.dll", SetLastError = true)]static extern bool MiniDumpWriteDump(IntPtr hProcess,int processId,IntPtr hFile,MiniDumpType dumpType,IntPtr exceptionParam,IntPtr userStreamParam,IntPtr callbackParam);public static void WriteDump(string dumpFilePath){using (var fs = new FileStream(dumpFilePath, FileMode.Create, FileAccess.Write, FileShare.None)){Process process = Process.GetCurrentProcess();bool success = MiniDumpWriteDump(process.Handle,process.Id,fs.SafeFileHandle.DangerousGetHandle(),MiniDumpType.MiniDumpWithFullMemory,IntPtr.Zero,IntPtr.Zero,IntPtr.Zero);if (!success){throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());}}}
}

调用生成dump文件: 在你的程序中可以在捕获异常时调用这个方法:

try
{// 代码可能抛出异常
}
catch (Exception ex)
{// 发生异常时生成dumpMiniDump.WriteDump("C:\\Dumps\\crashdump.dmp");throw; // 可以选择继续抛出异常或处理异常
}

还可以捕获未处理的异常,生成dump

AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{Exception e = (Exception)args.ExceptionObject;MiniDump.WriteDump("C:\\Dumps\\unhandled_exception.dmp");
};

这样,当未捕获的异常导致应用崩溃时,dump文件就会自动生成。


http://www.ppmy.cn/news/1522071.html

相关文章

代码随想录算法训练营第二十天| 39. 组合总和、40. 组合总和Ⅱ、131. 分割回文串

今日内容 leetcode. 39 组合总和leetcode. 40 组合总和Ⅱleetcode. 131 分割回文串 Leetcode. 39 组合总和 文章链接:代码随想录 (programmercarl.com) 题目链接:39. 组合总和 - 力扣(LeetCode) 本题不太一样的是可以对同一个数…

【脚手架 第一篇章】介绍一下若依微服务版框架

若依框架(RuoYi)是一个广泛使用的开源框架,它提供了多种版本以满足不同开发需求。以下是关于若依框架微服务版(RuoYi-Cloud)的详细介绍: 一、概述 RuoYi-Cloud 是基于 Spring Cloud 和 Spring Boot 的分布…

【盖世汽车-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

dp算法练习【6】

最长公共子序列 1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序…

IntelliJ Idea 常用快捷键列表

CtrlShift Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 CtrlE,最近的文件 CtrlShiftE,最近更改的文件 ShiftClick,可以关闭文件 Ctrl[ OR ],可以跑到大括号的…

httprunner学习笔记(自用版)

目录 一、安装二、脚本录制1、charles录制2、F12脚本录制 三、脚本生成1、har转换为json脚本2、har转换为yml脚本 四、执行脚本五、查看报告六、httpruner接口自动化项目架构 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本&am…

spring 事物使用场景说明

事务使用场景。 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据。为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到spring事务。 确实&am…

C++ 设计模式——解释器模式

目录 C 设计模式——解释器模式1. 主要组成成分2. 逐步构建解释器模式步骤1: 定义抽象表达式步骤2: 实现终结符表达式步骤3: 实现非终结符表达式步骤4: 构建语法树步骤5: 实现内存管理步骤6: 创建上下文和客户端 3. 解释器模式 UML 图UML 图解析 4. 解释器模式的优点5. 解释器模…