Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>The following worked:</p> <p>Prerequisites: Debugging Tools for Windows installed</p> <p>Managed interface C++/CLI</p> <p>DbgHelpNet.h:</p> <pre><code> // DbgHelpNet.h #pragma once #include &lt;dbghelp.h&gt; using namespace System; using namespace System; using namespace System::IO; using namespace System::Diagnostics; using namespace System::Runtime::InteropServices; using namespace System::Configuration; namespace DbgHelpNet { /// &lt;summary&gt;Defines the information density of the mini dump (see MINIDUMP_TYPE on MSDN)&lt;/summary&gt; public enum class MiniDumpTypeEnumeration { 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, MiniDumpValidTypeFlags = 0x0000ffff, }; public ref class MiniDumpWriteDump { public: static void MiniDumpWriteDump::WriteDump(String^ path); static void MiniDumpWriteDump::WriteDump(String^ path, IntPtr exceptionPointers, MiniDumpTypeEnumeration MiniDumpType); }; } </code></pre> <p>DbgHelpNet.cpp:</p> <pre><code> // This is the main DLL file. #include "stdafx.h" #include "DbgHelpNet.h" #include &lt;dbghelp.h&gt; #pragma comment( lib, "dbghelp") namespace DbgHelpNet { void MiniDumpWriteDump::WriteDump(String^ path) { IntPtr pep = System::Runtime::InteropServices::Marshal::GetExceptionPointers(); WriteDump(path, IntPtr(pep), MiniDumpTypeEnumeration::MiniDumpWithFullMemory); } void MiniDumpWriteDump::WriteDump(String^ path, IntPtr exceptionPointers, MiniDumpTypeEnumeration MiniDumpType) { PEXCEPTION_POINTERS pep = reinterpret_cast&lt;PEXCEPTION_POINTERS&gt;(exceptionPointers.ToPointer()); MINIDUMP_EXCEPTION_INFORMATION mdei = {GetCurrentThreadId(),pep,FALSE}; MINIDUMP_TYPE miniDumpType = static_cast&lt;MINIDUMP_TYPE&gt;(MiniDumpType); System::IO::FileStream^ fileStream = File::Create( path ); BOOL blnMiniDumpWriteDumpRetVal = ::MiniDumpWriteDump( GetCurrentProcess(), GetCurrentProcessId(), fileStream-&gt;Handle.ToPointer(), miniDumpType, (pep != NULL) ? &amp;mdei : NULL, NULL, NULL); fileStream-&gt;Close(); if(blnMiniDumpWriteDumpRetVal) { Trace::WriteLine("Successfully created minidump."); } else { Trace::TraceError( String::Format("Failed to create minidump! Last Error: {0}",GetLastError() )); } } } </code></pre> <p>Test Code:</p> <pre><code>using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; using System.Diagnostics; namespace MiniDumpTest { class Program { static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Console.WriteLine("started"); try { Console.WriteLine(MyFunc()); } finally { Console.WriteLine("finished"); Console.ReadLine(); } } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Console.WriteLine("CurrentDomain_UnhandledException"); DbgHelpNet.MiniDumpWriteDump.WriteDump(@"c:\temp\MyDump.dmp"); Console.WriteLine("MiniDump written"); } static int MyFunc() { int i = 0; ++i; if (i == 1) { throw new ApplicationException("bla"); } return i; } } } </code></pre> <p>Windbg (6.7.5.0): 0:000> k 100 ChildEBP RetAddr<br> 0012f30c 79eda99c kernel32!RaiseException+0x53 0012f36c 79fb48f8 mscorwks!RaiseTheExceptionInternalOnly+0x2a8 0012f430 00d08408 mscorwks!JIT_Throw+0xfc 0012f448 00d000dc MiniDumpTest!MiniDumpTest.Program.MyFunc()+0x70 [c:\temp\MiniDumpTest\MiniDumpTest\Program.cs @ 40] 0012f480 79e71b4c MiniDumpTest!MiniDumpTest.Program.Main(System.String[])+0x6c [c:\temp\MiniDumpTest\MiniDumpTest\Program.cs @ 18] 0012f490 79e821f9 mscorwks!CallDescrWorker+0x33 0012f510 79e96571 mscorwks!CallDescrWorkerWithHandler+0xa3 0012f648 79e965a4 mscorwks!MethodDesc::CallDescr+0x19c 0012f664 79e965c2 mscorwks!MethodDesc::CallTargetWorker+0x1f 0012f67c 79eefac5 mscorwks!MethodDescCallSite::CallWithValueTypes+0x1a 0012f7e0 79eef9e5 mscorwks!ClassLoader::RunMain+0x223 0012fa48 79eeff35 mscorwks!Assembly::ExecuteMainMethod+0xa6 0012ff18 79ef011f mscorwks!SystemDomain::ExecuteMainMethod+0x456 0012ff68 79ef004f mscorwks!ExecuteEXE+0x59 0012ffb0 79007c24 mscorwks!_CorExeMain+0x15c 0012ffc0 7c817077 mscoree!_CorExeMain+0x2c 0012fff0 00000000 kernel32!BaseProcessStart+0x23</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload