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文件就会自动生成。

相关推荐
小北方城市网几秒前
RabbitMQ 生产级实战:可靠性投递、高并发优化与问题排查
开发语言·分布式·python·缓存·性能优化·rabbitmq·ruby
爱学习的阿磊5 分钟前
C++中的策略模式应用
开发语言·c++·算法
郝学胜-神的一滴6 分钟前
Python中的bisect模块:优雅处理有序序列的艺术
开发语言·数据结构·python·程序人生·算法
Remember_9939 分钟前
Spring 事务深度解析:实现方式、隔离级别与传播机制全攻略
java·开发语言·数据库·后端·spring·leetcode·oracle
看得见的风11 分钟前
Claude Code + CCR配置(含OpenRouter、GLM、Kimi Coding Plan)
开发语言
L_090713 分钟前
【Linux】进程状态
linux·开发语言·c++
roman_日积跬步-终至千里13 分钟前
【Java并发】用 JMM 与 Happens-Before 解决多线程可见性与有序性问题
java·开发语言·spring
2401_8384725114 分钟前
C++异常处理最佳实践
开发语言·c++·算法
m0_7369191018 分钟前
C++中的类型标签分发
开发语言·c++·算法
天桥下的卖艺者22 分钟前
使用R语言编写一个生成金字塔图形的函数
开发语言·数据库·r语言