使用.net 4.7将Windows 10更新为创建者更新后,我在启动非常简单的代码时遇到了一个严重的问题。
描述:由于未处理的异常,进程终止。 异常信息: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
任何人都知道如何避免这种情况?
答案 0 :(得分:5)
在无法访问的基本块上运行优化时会导致此问题。 在您的情况下,编译器内联get_prop方法(无条件地返回false)。这导致JIT编译器将该区域视为无法访问。通常,JIT编译器会在运行优化之前删除无法访问的代码,但添加try / catch区域会导致JIT不删除这些基本块。
如果要阻止此问题,可以禁用优化,禁用get_prop的内联或将get_prop方法的实现更改为:
static bool s_alwaysFalse = false;
private bool prop {get{ return s_alwaysFalse;}}
我们已经收到了一些关于此问题的报告,我们已准备好修复程序,并将在即将发布的更新中提供给用户。