优雅地处理.NET核心中的损坏状态例外



我基本上有一个重复的问题,但对于.net core。

我有核心控制台应用程序:

class Program
{
    static void DoSomeAccessViolation()
    {
        // if you have any questions about why this throws,
        // the answer is "42", of course
        var ptr = new IntPtr(42);
        Marshal.StructureToPtr(42, ptr, true);
    }
    [SecurityCritical]
    [HandleProcessCorruptedStateExceptions]
    static void Main(string[] args)
    {
        try
        {
            DoSomeAccessViolation();
        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex);
        }
    }
}

我尝试添加一个设置.setting文件

<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ConsoleApp2" GeneratedClassName="Settings1">
  <Profiles />
  <Settings>
    <Setting Name="legacyCorruptedStateExceptionsPolicy" Type="System.Boolean" Scope="Application">
      <Value Profile="(Default)">True</Value>
    </Setting>
  </Settings>
</SettingsFile>

我尝试根据文档设置一个环境变量:

C:>set COMPlus_legacyCorruptedStateExceptionsPolicy=1
C:>dotnet run

C:>set COMPlus_legacyCorruptedStateExceptionsPolicy=true
C:>dotnet run

(在Windows上(。但是什么都没有用,该应用总是在不打印例外的情况下崩溃。

我一直在按时间顺序进行一些背景...

dotnet/coreclr问题#9045:条状损坏状态例外处理

dotnet/coreclr pr#10957:不要尊重属性whandprocesscorruptedStateExceptions

dotnet/coreclr问题#19192:无法捕获托管代码。

我目前。必须创建一个不受管理的包装器来捕获外部CSE。

您可以尝试更多选项,特别是FaffastOnCortedStateException与LegacyCorruptedStateExceptionspolicy结合使用。

我运行了您的代码,而提出的异常是executionEngineException。这是运行时的致命错误,这意味着运行时不能进一步执行您的程序。您无法捕获此例外,这是有充分理由的:您无法处理。您的代码无能为力来"修复"运行时并继续运行。

来自Microsoft Docu:当常见语言运行时执行引擎内部错误时,抛出的异常。和:此类型以前表示运行时未指定的致命错误。运行时不再提出此类型的例外。

唯一的事情保留在.NET核心中是legacyCorruptedStateExceptionsPolicy行为。

为了启用此功能,您必须将COMPlus_legacyCorruptedStateExceptionsPolicy环境变量设置为1,然后再开始过程。但是,在.NET核心中,它将捕获损坏的状态异常,而不是在.NET中,由于.NET移植期间做出的决定:(

例如,如果您将Marshal.StructureToPtr(42, (IntPtr)42, true);替换为Marshal.ReadInt32((IntPtr)42);(并设置环境变量(AVE将被成功生成并捕获。

您可以在此处阅读有关此问题的详细信息。

总体关于.net核心中损坏状态例外:

  1. 在您的过程开始之前,要捕获其中一些将COMPlus_legacyCorruptedStateExceptionsPolicy环境变量设置为1
  2. 如果您从本机呼叫中获得CSE。尝试将异常处理(如果您有来源(移动,或者尝试按照泰勒(Tylery86(的建议。
  3. 如果重要的话,请写下看门狗进程以检查您的应用程序崩溃。然后查看事件日志并分析崩溃转储...

相关内容

  • 没有找到相关文章

最新更新