为混合代码 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的主要内容,如果未能解决你的问题,请参考以下文章