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

时间:2010-04-26 08:40:31

标签: c# c++ interop c++-cli exception

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

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

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

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

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

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

修改

通过“不捕获异常”我也意味着捕获然后重新抛出,这确实保留了丰富的异常信息。

现在我正在考虑从不压迫Exception或来自System.Exception的任何事情。这意味着System.SystemException(和朋友)总是导致程序结束并产生转储,而抛出的所有其他异常需要从某个子类型(AccessViolation?)派生。

1 个答案:

答案 0 :(得分:1)

我发现使用Vectored Exception Handling我可以获得任何SEH例外的第一次机会通知,并利用这个机会产生一个小型转储。