我有基本的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;
}
我沒有看到任何錯誤。很多東西缺失。 –
缺什麼?這個相同的代碼在未處理異常處理程序的上下文中工作得非常好,但是在另一種情況下,異常處理失敗。還有什麼我可以添加到我的原始問題,使其更清晰? –
好吧,訪問衝突異常本身似乎缺少對初學者的操作。你可以包括一個堆棧跟蹤? –