【问题标题】:Disabling .NET handling of native exceptions禁用 .NET 处理本机异常
【发布时间】:2013-03-08 20:16:58
【问题描述】:

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

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

【问题讨论】:

    标签: exception access-violation dump mixed-mode


    【解决方案1】:

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

    你会在我的this MSDN forum threadthis pinvoke.net snippet 的回答中找到资源,应该足以拼凑你自己的资源。

    【讨论】:

    • 感谢您的回答,但 AppDomain.UnhandledException 与在返回托管代码之前捕获异常存在相同的问题:进程已损坏并且尝试在进程本身内生成转储可能会挂起。
    • 当然,这很有可能。进程状态可能被破坏,以至于无法继续运行代码。例如,由于进程堆损坏而导致的崩溃会导致堆锁定。为此,您将需要另一种武器,使用另一个进程生成小型转储。从Taskmgr.exe手动或使用SysInternals' ProcDump之类的实用程序
    • Windows 错误报告已配置为在外部生成转储。问题是它在未处理异常时生成转储,但.Net 处理它并破坏上下文。 AFAIK,ProcDump 也遇到了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2020-03-07
    • 2014-09-21
    相关资源
    最近更新 更多