为混合代码 DLL 中的 _caught_ SEH 异常生成 Mini Dump

Posted

技术标签:

【中文标题】为混合代码 DLL 中的 _caught_ SEH 异常生成 Mini Dump【英文标题】:Producing Mini Dumps for _caught_ SEH exceptions in mixed code DLL 【发布时间】:2010-04-26 08:40:30 【问题描述】:

我正在尝试使用类似于clrdump 的代码在我的托管进程中创建小型转储。

此托管进程调用 C++/CLI 代码,该代码调用一些本机 C++ 静态库代码,其中可能会引发 SEH 异常(例如,偶尔的访问冲突)。

  C# WinForms
  -> 
    C++/CLI DLL
    ->
      Static C++ Lib
      ->
        ACCESS VIOLATION

我们的政策是为所有 SEH 异常(捕获和未捕获)生成小型转储,然后将它们转换为 C++ 异常以由应用程序代码处理。这适用于纯原生进程就好了;但是当应用程序是 C# 应用程序时 - 不是那么多。

我看到在 C# 进程中从 SEH 异常生成转储的唯一方法是捕获它们 - 然后,作为未处理的异常,使用 Application.ThreadException 处理程序创建一个小型转储。另一种方法是让 CLR 将 SEH 异常转换为 .Net 异常并捕获它(例如 System.AccessViolationException)——但这意味着不会创建转储,并且信息会丢失(Exception 中的堆栈跟踪信息不是像迷你垃圾场一样丰富)。

那么,我如何通过创建小型转储将异常转换为 .Net 异常来处理 SEH 异常,以便我的应用程序可以尝试恢复?

编辑

“不捕获异常”也指捕获然后重新抛出,这确实保留了丰富的异常信息。

现在我正在考虑永远不要压制System.Exception 或任何源自System.SystemException 的东西。这意味着AccessViolation(和朋友们)总是会导致程序结束并产生转储,并且抛出的所有其他异常都需要派生自某个子类型(ApplicationException?)。

【问题讨论】:

【参考方案1】:

我发现使用Vectored Exception Handling,我可以获得任何 SEH 异常的第一时间通知,并利用这个机会生成一个小型转储。

【讨论】:

以上是关于为混合代码 DLL 中的 _caught_ SEH 异常生成 Mini Dump的主要内容,如果未能解决你的问题,请参考以下文章

SEH 结构化异常

SEH结构化异常处理

第25章 SEH结构化异常处理_未处理异常及向量化异常

结构化异常SEH处理机制详细介绍(二)

C和C++混合编程(__cplusplus 与 external "c" 的使用)

C和C++混合编程(__cplusplus 与 external "c" 的使用)