1

I have the basic MiniDumpWriteDump method interop copied off the internet in my C# (3.5) project.

Up till now, i have used this code to register on the UnhandledException event, to take a crash dump before the process shuts down.

In a particular scenario i am facing now, i have set this function to be used in some other case, to take a diagnostic memory dump of the process.

Whenever this function gets called (not from the UnhandledException handler), it throws an AccessViolationException

Here's what the MiniDump code looks like (removed some redundant parts):

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.ExceptionPointers = Marshal.GetExceptionPointers();

    bool bRet = MiniDumpWriteDump(
                GetCurrentProcess(),
                GetCurrentProcessId(),
                fs.SafeFileHandle.DangerousGetHandle(),
                (uint)dumpType,
                ref exp,
                IntPtr.Zero,
                IntPtr.Zero);

    return bRet;
}

Native types are defined like so:

//typedef struct _MINIDUMP_EXCEPTION_INFORMATION {
        //    DWORD ThreadId;
        //    PEXCEPTION_POINTERS ExceptionPointers;
        //    BOOL ClientPointers;
        //} MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
        // Pack=4 is important! So it works also for x64!
        [StructLayout(LayoutKind.Sequential, Pack = 4)]  
        struct MiniDumpExceptionInformation
        {
            public uint ThreadId;
            public IntPtr ExceptionPointers;
            [MarshalAs(UnmanagedType.Bool)]
            public bool ClientPointers;
        }
4

1 に答える 1