【问题标题】:Handle Access Violation Exception that is not explicitly thrown by unmanaged code处理非托管代码未显式抛出的访问冲突异常
【发布时间】:2021-07-13 09:33:00
【问题描述】:

我知道Access Violation Exception 是一个我不应该真正尝试处理的严重问题。 我也知道,在最新版本的.Net 中,可以通过

  1. 将此<legacyCorruptedStateExceptionsPolicy enabled="true"> 放入配置中,所有catch 块将能够捕获错误
  2. 使用HandleProcessCorruptedStateExceptions 属性装饰您想要捕获这些异常的方法

其实this说的很清楚了。

但我的情况有点不同,我似乎找不到解决方案: 我正在使用一个非托管 c++ 库,我将在我的应用程序的某个时间点对其进行初始化。然后这个 dll 本身会自己执行一些任务(从服务器拉数据到缓存,记录等)这个访问冲突异常看起来是在这个过程中抛出的,而不是当应用程序直接调用 dll 的 api 时。所以我没有办法try catch这个违规逻辑。

在这个阶段,我已经设法在AppDomain.CurrentDomain.UnhandledException 中捕捉到它,如下所示:

    [HandleProcessCorruptedStateExceptions, SecurityCritical]
    private static void CurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Logger.Error("Unhandle Exception", (Exception)e.ExceptionObject);
    }

但我仍然不能完全防止应用程序崩溃。 我知道我可能应该让应用程序崩溃。但我真的相信这个错误并不像看起来那么糟糕,我只需要知道如何抑制它,即使我可能不会使用它。

有什么想法吗?

【问题讨论】:

    标签: c# .net error-handling access-violation unmanaged


    【解决方案1】:

    Access violation exception 表示出现严重问题,需要修复。不建议在出现此类错误后继续运行,因为您无法确定进程的状态,并且如果您尝试继续,可能会导致更严重的错误。如果这是在由第三方代码启动的线程上抛出的,据我所知,您几乎无法捕获它。我不确定你为什么认为它没有看起来那么糟糕,但我会非常小心地尝试处理它。

    如果您无法访问第三方代码,最好的解决方案可能是联系作者并解决问题。第二个最佳解决方案可能是在单独的进程中运行第三方代码。这样您就可以确保您的进程在代码崩溃时不会受到损害。

    【讨论】:

    • 我想知道在另一个 AppDomain 中运行第三方代码是否会做同样的事情。
    • @Frostless 据我所知,appdomains 只为托管代码提供隔离。如果您有使用任意内存地址的本机代码,您可能需要保护单独的进程。此外,与一个 appdomain 和一个单独的进程进行通信似乎很相似,所以我认为使用 appdomains 并没有什么收获。
    猜你喜欢
    • 2020-10-24
    • 2011-04-12
    • 2019-12-31
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多