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

相关推荐
CSCN新手听安1 分钟前
【Qt】Qt窗口(六)QMessageBox消息对话框的使用
开发语言·c++·qt
CDN36042 分钟前
[硬核] 你的DNS正在“裸奔”?用Python手撕DNS劫持与隧道检测逻辑
开发语言·网络·python
froginwe111 小时前
jQuery 添加元素
开发语言
zhangfeng11331 小时前
PHP 语法检查命令 php -l “$file“ > /dev/null 2>&1;
开发语言·php
csbysj20201 小时前
解释器模式
开发语言
CoderCodingNo1 小时前
【信奥业余科普】C++ 的奇妙之旅 | 20:更安全的间接访问——引用的设计动机与实战对比
开发语言·c++
知识汲取者1 小时前
巨量引擎 Marketing API Java SDK 介绍
java·开发语言
182******20831 小时前
2026年40岁自学java还能找到工作吗
java·开发语言
唐青枫2 小时前
别只会用 MemoryCache!C#.NET CacheManager 详解:多级缓存、Region 与 Redis 实战
c#·.net
yuzhiboyouye2 小时前
java线程池
java·开发语言·firefox