2012-10-22 36 views
1

我有基本的MiniDumpWriteDump方法interop在我的C#(3.5)項目中從互聯網上覆制。來自託管代碼的MinidumpWriteDump拋出一個AccessViolationException

到目前爲止,我已經使用這段代碼來註冊UnhandledException事件,在進程關閉之前進行崩潰轉儲。

在我現在面臨的特定情況下,我已經設置了此功能以便在其他情況下使用該流程的診斷內存轉儲。

每當這個函數被調用(而不是從UnhandledException處理器),它拋出一個AccessViolationException

下面是轉儲的代碼是什麼樣子(去掉一些多餘的部分):

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

我沒有看到任何錯誤。很多東西缺失。 –

+0

缺什麼?這個相同的代碼在未處理異常處理程序的上下文中工作得非常好,但是在另一種情況下,異常處理失敗。還有什麼我可以添加到我的原始問題,使其更清晰? –

+0

好吧,訪問衝突異常本身似乎缺少對初學者的操作。你可以包括一個堆棧跟蹤? –

回答

0

Marshal.GetExceptionPointers()可能返回I ntPtr.Zero(也許當操作系統看到異常處理)。如果是這種情況,您可以嘗試將「MiniDumpWriteDump」的調用放在其他地方。我遇到了同樣的問題,並通過將'MiniDumpWriteDump'放入事件處理程序'AppDomain.CurrentDomain.FirstChanceException'來解決它。