4

我有一个调用混合模式 C++ dll 的 C# 应用程序。我通过 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps 启用了转储生成。

当 dll 访问无效内存时,运行时会将 win32 异常转换为托管 System.AccessViolationException,并在生成转储之前展开堆栈,从而破坏本机堆栈信息。根据 msdn 的说法,我可以在 .net 获取异常并手动生成转储之前自己捕获异常,但是在已经损坏的程序上运行代码可能会挂起它。那么,如何禁用 SEH 翻译呢?

4

1 回答 1

1

你不能禁用它。除非您捕获到异常,否则 CLR 不会展开堆栈。确保你没有。这需要通过 AppDomain.UnhandledException 事件处理程序。您需要的基本函数是 Marshal.GetExceptionPointers(),它会在您打开 minidump 时查明异常。

你会在这个 MSDN 论坛主题这个 pinvoke.net 片段中找到我的答案中的资源,应该足以将你自己的拼凑在一起。

于 2013-03-19T22:52:51.543 回答