我有一个调用混合模式C ++ dll的C#应用程序。我通过HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ Windows Error Reporting \ LocalDumps启用了转储生成。
当dll访问无效内存时,运行时将win32异常转换为受管System.AccessViolationException,并在生成转储之前解除堆栈,从而破坏本机堆栈信息。根据msdn的说法,我之前可以自己捕获异常.net获取它并手动生成转储,但是在已经损坏的程序上运行代码可能会挂起它。那么,我该如何禁用SEH翻译呢?
答案 0 :(得分:1)
你不能禁用它。除非您捕获异常,否则CLR不会展开堆栈。确保你没有。这需要通过AppDomain.UnhandledException事件处理程序。你需要的基本功能是Marshal.GetExceptionPointers(),这是在你打开minidump时会查明异常的函数。
我会在this MSDN forum thread和this pinvoke.net snippet的答案中找到资源,应该足以让自己在一起。