Windows 10 Creators 更新 .net 4.7 System.AccessViolationException 问题
Windows 10 Creators update .net 4.7 System.AccessViolationException issue
在使用 .net 4.7 更新 Windows 10 to creators update 后,我在启动非常简单的代码时遇到了一个严重问题。
描述:进程因未处理的异常而终止。
异常信息:System.AccessViolationException
class Program
{
private int? m_bool;
private bool prop {get{ return false;}}
void test()
{
//nothing
}
private object Test()
{
if (prop)
{
try
{
test();
}
catch (Exception) {}
m_bool = 1;
}
return null;
}
static void Main(string[] args)
{
new Program().Test();
}
}
似乎类似的问题是 https://github.com/dotnet/coreclr/issues/10826
有人知道如何避免这种情况吗?
问题是在运行对无法访问的基本块进行优化时引起的。
在您的情况下,编译器内联 get_prop 方法(无条件 returns false)。这导致 JIT 编译器将该区域视为不可访问。通常,JIT 编译器会在我们 运行 优化之前删除无法访问的代码,但添加 try/catch 区域会导致 JIT 不删除这些基本块。
如果你想防止这个问题,你可以禁用优化,禁用 get_prop 的内联或将 get_prop 方法的实现更改为:
static bool s_alwaysFalse = false;
private bool prop {get{ return s_alwaysFalse;}}
我们收到了几份关于此问题的报告,我们确实准备好了修复程序,将在即将发布的更新中提供给用户。
在使用 .net 4.7 更新 Windows 10 to creators update 后,我在启动非常简单的代码时遇到了一个严重问题。
描述:进程因未处理的异常而终止。 异常信息:System.AccessViolationException
class Program
{
private int? m_bool;
private bool prop {get{ return false;}}
void test()
{
//nothing
}
private object Test()
{
if (prop)
{
try
{
test();
}
catch (Exception) {}
m_bool = 1;
}
return null;
}
static void Main(string[] args)
{
new Program().Test();
}
}
似乎类似的问题是 https://github.com/dotnet/coreclr/issues/10826
有人知道如何避免这种情况吗?
问题是在运行对无法访问的基本块进行优化时引起的。 在您的情况下,编译器内联 get_prop 方法(无条件 returns false)。这导致 JIT 编译器将该区域视为不可访问。通常,JIT 编译器会在我们 运行 优化之前删除无法访问的代码,但添加 try/catch 区域会导致 JIT 不删除这些基本块。
如果你想防止这个问题,你可以禁用优化,禁用 get_prop 的内联或将 get_prop 方法的实现更改为:
static bool s_alwaysFalse = false;
private bool prop {get{ return s_alwaysFalse;}}
我们收到了几份关于此问题的报告,我们确实准备好了修复程序,将在即将发布的更新中提供给用户。