C# 托管代码中的MiniTumpWriteDomainp引发AccessViolationException
在我的C#(3.5)项目中,我从互联网上复制了基本的MiniDumpWriteDump方法interop 到目前为止,我已经使用这段代码注册了UnhandledException事件,以便在进程关闭之前进行崩溃转储 在我现在面临的一个特定场景中,我已将此函数设置为在其他情况下使用,以获取进程的诊断内存转储 无论何时调用此函数(不是从UnhandledException处理程序),它都会抛出AccessViolationException异常 下面是MiniDump代码的样子(删除了一些冗余部分): 本机类型的定义如下:C# 托管代码中的MiniTumpWriteDomainp引发AccessViolationException,c#,.net,interop,clr,minidump,C#,.net,Interop,Clr,Minidump,在我的C#(3.5)项目中,我从互联网上复制了基本的MiniDumpWriteDump方法interop 到目前为止,我已经使用这段代码注册了UnhandledException事件,以便在进程关闭之前进行崩溃转储 在我现在面临的一个特定场景中,我已将此函数设置为在其他情况下使用,以获取进程的诊断内存转储 无论何时调用此函数(不是从UnhandledException处理程序),它都会抛出AccessViolationException异常 下面是MiniDump代码的样子(删除了一些冗余部分)
//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;
}
Marshal.GetExceptionPointers()可能返回IntPtr.Zero(可能是在操作系统认为异常已处理时)。如果是这种情况,您可以尝试将“MiniDumpWriteDump”的调用放在其他地方。我也遇到了同样的问题,通过将“minidumpWriteDomain”放入事件处理程序“AppDomain.CurrentDomain.FirstChanceException”中解决了它。我没有发现任何错误。少了很多东西,少了什么?同样的代码在未处理的异常处理程序的上下文中工作得非常好,但是在另一种情况下,异常处理程序失败。我还可以在我的原始问题中添加什么来让它更清楚呢?好吧,对于初学者来说,访问冲突异常本身似乎在实际操作中丢失了。你能包括一个堆栈跟踪吗?
//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;
}