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

在代码中手动生成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)
{
    // 发生异常时生成dump
    MiniDump.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文件就会自动生成。

相关推荐
Boilermaker199210 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
MM_MS10 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
玩泥巴的11 小时前
飞书 .NET SDK 事件处理的幂等性与去重机制
c#·.net·二次开发·飞书
꧁Q༒ོγ꧂11 小时前
LaTeX 语法入门指南
开发语言·latex
njsgcs11 小时前
ue python二次开发启动教程+ 导入fbx到指定文件夹
开发语言·python·unreal engine·ue
alonewolf_9911 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
在路上看风景11 小时前
3.2 FileStream
c#
zwm26988881511 小时前
6号楼 部分声光24v电压达不到,显示11v
c#
古城小栈11 小时前
Rust 迭代器产出的引用层数——分水岭
开发语言·rust
ghie909011 小时前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab