[英]Gracefully handling corrupted state exceptions in .NET Core
我基本上有一个重复的问题,但对于 .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);
}
}
}
我试图添加一个 Settings.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 :不尊重属性 HandleProcessCorruptedStateExceptions
dotnet/coreclr问题 #19192 :无法在托管代码中捕获从本机 Linux 代码抛出的任何用户异常
我现在是 SOL。 必须创建一个非托管的包装器来捕获外部 CSE。
您可以尝试更多选项,特别是 FailFastOnCorruptedStateException 与 legacyCorruptedStateExceptionsPolicy 相结合。
我运行了您的代码,引发的异常是 ExecutionEngineException。 这是运行时中的致命错误,意味着运行时无法进一步执行您的程序。 您无法捕获此异常是有充分理由的:您无法处理它。 您的代码无法“修复”运行时并继续运行。
来自微软文档:公共语言运行库的执行引擎出现内部错误时抛出的异常。 并且:此类型先前表示运行时中存在未指定的致命错误。 运行时不再引发此异常,因此此类型已过时。
.net 核心中唯一保留的就是legacyCorruptedStateExceptionsPolicy
行为。
要启用此功能,您必须在流程启动之前将COMPlus_legacyCorruptedStateExceptionsPolicy
环境变量设置为1
。 但是,在 .net core 中,由于在 .net 移植期间做出的决定,它将比在 .net 中捕获更少的损坏状态异常:(
例如,如果您在代码中替换Marshal.StructureToPtr(42, (IntPtr)42, true);
与Marshal.ReadInt32((IntPtr)42);
(并设置环境变量)会成功生成和捕获AVE。
您可以在此处阅读有关此问题的详细信息。
关于 .net core 中损坏状态异常的总体情况:
COMPlus_legacyCorruptedStateExceptionsPolicy
环境变量设置为1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.