马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在代码中手动天生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文件就会自动天生。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |