托管代码中的MinidumpWriteDump会引发AccessViolationException

时间:2012-10-22 16:55:51

标签: c# .net interop clr minidump

我在C#(3.5)项目中将基本的MiniDumpWriteDump方法互操作复制到了互联网上。

到目前为止,我已经使用此代码在UnhandledException事件上注册,以在进程关闭之前进行崩溃转储。

在我现在面临的特定场景中,我已将此功能设置为在其他情况下使用,以获取该过程的诊断内存转储。

每当调用此函数时(不是来自UnhandledException处理程序),它都会抛出 AccessViolationException

以下是MiniDump代码的样子(删除了一些冗余部分):

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;
}

本机类型的定义如下:

//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;
        }

1 个答案:

答案 0 :(得分:0)

Marshal.GetExceptionPointers()可能会返回IntPtr.Zero(可能是当OS看到处理的异常时)。如果是这种情况,您可以尝试拨打' MiniDumpWriteDump'别的地方。我遇到了同样的问题并通过放置' MiniDumpWriteDump'来解决它。进入事件处理程序' AppDomain.CurrentDomain.FirstChanceException'。