c# 怎样让应用步调瓦解时天生dump

[复制链接]
发表于 2026-1-12 08:16:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
代码中手动天生Dump文件

研究了一下,可以通过代码在应用瓦解或捕捉特定非常时,手动天生dump文件。常用的是调用Windows的MiniDumpWriteDump API。可以利用P/Invoke调用该函数,详细步调如下:
导入须要的Windows API
  1. using System;
  2. using System.Diagnostics;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. class MiniDump
  6. {
  7.     [Flags]
  8.     public enum MiniDumpType
  9.     {
  10.         MiniDumpNormal = 0x00000000,
  11.         MiniDumpWithDataSegs = 0x00000001,
  12.         MiniDumpWithFullMemory = 0x00000002,
  13.         MiniDumpWithHandleData = 0x00000004,
  14.         MiniDumpFilterMemory = 0x00000008,
  15.         MiniDumpScanMemory = 0x00000010,
  16.         MiniDumpWithUnloadedModules = 0x00000020,
  17.         MiniDumpWithIndirectlyReferencedMemory = 0x00000040,
  18.         MiniDumpFilterModulePaths = 0x00000080,
  19.         MiniDumpWithProcessThreadData = 0x00000100,
  20.         MiniDumpWithPrivateReadWriteMemory = 0x00000200,
  21.         MiniDumpWithoutOptionalData = 0x00000400,
  22.         MiniDumpWithFullMemoryInfo = 0x00000800,
  23.         MiniDumpWithThreadInfo = 0x00001000,
  24.         MiniDumpWithCodeSegs = 0x00002000,
  25.         MiniDumpWithoutAuxiliaryState = 0x00004000,
  26.         MiniDumpWithFullAuxiliaryState = 0x00008000,
  27.         MiniDumpWithPrivateWriteCopyMemory = 0x00010000,
  28.         MiniDumpIgnoreInaccessibleMemory = 0x00020000,
  29.         MiniDumpWithTokenInformation = 0x00040000
  30.     }
  31.     [DllImport("dbghelp.dll", SetLastError = true)]
  32.     static extern bool MiniDumpWriteDump(
  33.         IntPtr hProcess,
  34.         int processId,
  35.         IntPtr hFile,
  36.         MiniDumpType dumpType,
  37.         IntPtr exceptionParam,
  38.         IntPtr userStreamParam,
  39.         IntPtr callbackParam);
  40.     public static void WriteDump(string dumpFilePath)
  41.     {
  42.         using (var fs = new FileStream(dumpFilePath, FileMode.Create, FileAccess.Write, FileShare.None))
  43.         {
  44.             Process process = Process.GetCurrentProcess();
  45.             bool success = MiniDumpWriteDump(
  46.                 process.Handle,
  47.                 process.Id,
  48.                 fs.SafeFileHandle.DangerousGetHandle(),
  49.                 MiniDumpType.MiniDumpWithFullMemory,
  50.                 IntPtr.Zero,
  51.                 IntPtr.Zero,
  52.                 IntPtr.Zero);
  53.             if (!success)
  54.             {
  55.                 throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
  56.             }
  57.         }
  58.     }
  59. }
复制代码
调用天生dump文件: 在你的步调中可以在捕捉非常时调用这个方法:
  1. try
  2. {
  3.     // 代码可能抛出异常
  4. }
  5. catch (Exception ex)
  6. {
  7.     // 发生异常时生成dump
  8.     MiniDump.WriteDump("C:\\Dumps\\crashdump.dmp");
  9.     throw; // 可以选择继续抛出异常或处理异常
  10. }
复制代码
还可以捕捉未处理处罚的非常,天生dump
  1. AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
  2. {
  3.     Exception e = (Exception)args.ExceptionObject;
  4.     MiniDump.WriteDump("C:\\Dumps\\unhandled_exception.dmp");
  5. };
复制代码
如许,当未捕捉的非常导致应用瓦解时,dump文件就会自动天生。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表