This code from the network, do not remember where to reprint, belongs to original author, exported to a memory snapshot into VS and other tools to track the problem.
MiniDumper.cs
sealed class MiniDumper { [Flags] public enum Type: uint { // From dbghelp.h: MiniDumpNormal = 0x00000000, MiniDumpWithDataSegs = 0x00000001 ; With the mini dump Memory Full = 0x00000002 ; MiniDumpWithHandleData = 0x00000004 ; Mini Filter Memory Dump = 0x00000008 ; MiniDumpScanMemory = 0x00000010 ; MiniDumpWithUnloadedModules = 0x00000020 ; MiniDumpWithIndirectlyReferencedMemory = 0x00000040 ; MiniDumpFilterModulePaths = 0x00000080 ; MiniDumpWithProcessThreadData = 0x00000100 ; MiniDumpWithPrivateReadWriteMemory = 0x00000200 ; MiniDumpWithoutOptionalData = 0x00000400 ; With Full mini dump Memory Info = 0x00000800 ; MiniDumpWithThreadInfo = 0x00001000 ; MiniDumpWithCodeSegs = 0x00002000 ; MiniDumpWithoutAuxiliaryState = 0x00004000 ; MiniDumpWithFullAuxiliaryState = 0x00008000 ; MiniDumpWithPrivateWriteCopyMemory = 0x00010000, MiniDumpIgnoreInaccessibleMemory = 0x00020000 ; MiniDumpValidTypeFlags = 0x0003ffff , }; //typedef struct _MINIDUMP_EXCEPTION_INFORMATION { // DWORD ThreadId; // PEXCEPTION_POINTERS ExceptionPointers; // BOOL ClientPointers; //} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION; [StructLayout(LayoutKind.Sequential, Pack = 4)] // Pack=4 is important! So it works also for x64! struct MiniDumpExceptionInformation { public uint ThreadId; public IntPtr ExceptioonPointers; [MarshalAs(UnmanagedType.Bool)] public bool ClientPointers; } //BOOL //WINAPI //MiniDumpWriteDump( // __in HANDLE hProcess, // __in DWORD ProcessId, // __in HANDLE hFile, // __in MINIDUMP_TYPE DumpType, // __in_opt PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, // __in_opt PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, // __in_opt PMINIDUMP_CALLBACK_INFORMATION CallbackParam // ); [DllImport("dbghelp.dll", EntryPoint = "MiniDumpWriteDump", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)] static extern bool MiniDumpWriteDump( IntPtr hProcess, uint processId, IntPtr hFile, uint dumpType, ref MiniDumpExceptionInformation expParam, IntPtr userStreamParam, IntPtr callbackParam); [DllImport("kernel32.dll", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] static extern uint GetCurrentThreadId(); [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcess", ExactSpelling = true)] static extern IntPtr GetCurrentProcess(); [DllImport("kernel32.dll", EntryPoint = "GetCurrentProcessId", ExactSpelling = true)] static extern uint GetCurrentProcessId(); public static bool Write(string fileName) { return Write(fileName, Typ.MiniDumpWithFullMemory); } public static bool Write(string fileName, Typ dumpTyp) { using (var fs = new System.IO.FileStream(fileName, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) { MiniDumpExceptionInformation exp; exp.ThreadId = GetCurrentThreadId(); exp.ClientPointers = false; exp.ExceptioonPointers = System.Runtime.InteropServices.Marshal.GetExceptionPointers(); bool bRet = MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), fs.SafeFileHandle.DangerousGetHandle(), (uint)dumpTyp, ref exp, IntPtr.Zero, IntPtr.Zero); return bRet; } } }
Instructions:
using System; using System.Runtime.InteropServices; namespace MiniDumpTest1 { class Program { static void Main(string[] args) { try { string a = null; a.PadLeft(10); } catch (System.Exception e) { Console.WriteLine(e); string dumpFile = System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "dump.dmp"); MiniDumper.Write(dumpFile); } } } }
Version requires .NET Framework 3.5