我正在尝试使用类似于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
?)派生。