gpt4 book ai didi

c# - 为混合代码 DLL 中_caught_ SEH 异常生成小型转储

转载 作者:太空狗 更新时间:2023-10-29 23:10:01 25 4
gpt4 key购买 nike

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

此托管进程调用 C++/CLI 代码,后者调用一些 native 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(和 friend )总是导致程序结束并产生转储,并且抛出的所有其他异常都需要派生自某个子类型(ApplicationException?)。

最佳答案

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

关于c# - 为混合代码 DLL 中_caught_ SEH 异常生成小型转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2712070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com