//------------------------------------------------------------------------------------------------------ /// <summary> /// Дамп записывается в файл с уникальным названием (FileName), /// который будет храниться в той же директории, что и exe файл. /// Перед тем как вызвать MiniDumpWriteDump, инициализируем структуру /// типа MINIDUMP_EXCEPTION_INFORMATION. /// </summary> /// <param name="pathToDirectory">Путь к директории сохранения дампа</param> /// <param name="fileName">Возвращает имя созданого файла дампа</param> public static void CreateMiniDump( String pathToDirectory, DUMP_TYPE typeOfDump, out String fileName) { using (System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess()) { fileName = String.Format(@"CRASH_DUMP_{0}_{1}.dmp", DateTime.Today.ToShortDateString(), DateTime.Now.Ticks); String pathToDump = pathToDirectory + @"\" + fileName; MINIDUMP_EXCEPTION_INFORMATION Mdinfo = new MINIDUMP_EXCEPTION_INFORMATION(); Mdinfo.ThreadId = GetCurrentThreadId(); Mdinfo.ExceptionPointers = Marshal.GetExceptionPointers(); Mdinfo.ClientPointers = 1; using (FileStream fs = new FileStream(pathToDump, FileMode.Create)) { switch (typeOfDump) { case DUMP_TYPE.MiniDumpFilterMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpFilterModulePaths: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpFilterTriage: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpIgnoreInaccessibleMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpNormal: { MiniDumpWriteDump( process.Handle, (uint)process.Id, fs.SafeFileHandle.DangerousGetHandle(), (Int32)DUMP_TYPE.MiniDumpNormal, ref Mdinfo, IntPtr.Zero, IntPtr.Zero); break; } case DUMP_TYPE.MiniDumpScanMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpValidTypeFlags: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithCodeSegs: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithDataSegs: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullAuxiliaryState: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullMemoryInfo: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithHandleData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithIndirectlyReferencedMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithModuleHeaders: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithoutAuxiliaryState: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithoutOptionalData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithPrivateReadWriteMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithPrivateWriteCopyMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithProcessThreadData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithThreadInfo: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithTokenInformation: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithUnloadedModules: { throw new NotImplementedException(); //break; } default: { break; } } } } }
//------------------------------------------------------------------------------------------------------ /// <summary> /// Дамп записывается в файл с уникальным названием (FileName), /// который будет храниться в той же директории, что и exe файл. /// Перед тем как вызвать MiniDumpWriteDump, инициализируем структуру /// типа MINIDUMP_EXCEPTION_INFORMATION. /// </summary> /// <param name="pathToDirectory">Путь к директории сохранения дампа</param> /// <param name="fileName">Возвращает имя созданого файла дампа</param> public static void CreateMiniDump( String pathToDirectory, DUMP_TYPE typeOfDump, out String fileName) { using (System.Diagnostics.Process process = System.Diagnostics.Process.GetCurrentProcess()) { fileName = String.Format(@"CRASH_DUMP_{0}_{1}.dmp", DateTime.Today.ToShortDateString(), DateTime.Now.Ticks); String pathToDump = pathToDirectory + @"\" + fileName; MINIDUMP_EXCEPTION_INFORMATION Mdinfo = new MINIDUMP_EXCEPTION_INFORMATION(); Mdinfo.ThreadId = GetCurrentThreadId(); Mdinfo.ExceptionPointers = Marshal.GetExceptionPointers(); Mdinfo.ClientPointers = 1; using (FileStream fs = new FileStream(pathToDump, FileMode.Create)) { switch (typeOfDump) { case DUMP_TYPE.MiniDumpFilterMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpFilterModulePaths: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpFilterTriage: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpIgnoreInaccessibleMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpNormal: { MiniDumpWriteDump( process.Handle, (uint)process.Id, fs.SafeFileHandle.DangerousGetHandle(), (Int32)DUMP_TYPE.MiniDumpNormal, ref Mdinfo, IntPtr.Zero, IntPtr.Zero); break; } case DUMP_TYPE.MiniDumpScanMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpValidTypeFlags: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithCodeSegs: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithDataSegs: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullAuxiliaryState: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithFullMemoryInfo: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithHandleData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithIndirectlyReferencedMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithModuleHeaders: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithoutAuxiliaryState: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithoutOptionalData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithPrivateReadWriteMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithPrivateWriteCopyMemory: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithProcessThreadData: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithThreadInfo: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithTokenInformation: { throw new NotImplementedException(); //break; } case DUMP_TYPE.MiniDumpWithUnloadedModules: { throw new NotImplementedException(); //break; } default: { break; } } } } }
static extern bool MiniDumpWriteDump( IntPtr hProcess, uint ProcessId, IntPtr hFile, int DumpType, ref MINIDUMP_EXCEPTION_INFORMATION ExceptionParam, IntPtr UserStreamParam, IntPtr CallbackParam);