- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the help center .
8年前关闭。
下面的示例代码自然发生。突然间,我的代码听起来非常难听 FatalExecutionEngineError
异常(exception)。我花了 30 分钟的时间试图隔离和最小化罪魁祸首样本。使用 Visual Studio 2012 作为控制台应用程序编译它:
class A<T>
{
static A() { }
public A() { string.Format("{0}", string.Empty); }
}
class B
{
static void Main() { new A<object>(); }
}
string.Empty
,但我吠错树了吗?更改有关该代码的任何内容都会使其按预期运行 - 例如删除
A
的空静态构造函数,或从
object
更改类型参数至
int
.
最佳答案
这也不是一个完整的答案,但我有一些想法。
我相信我已经找到了一个很好的解释,我们会发现没有 .NET JIT 团队的人回答。
更新
我看的更深了一点,我相信我已经找到了问题的根源。它似乎是由 JIT 类型初始化逻辑中的错误和依赖于 JIT 按预期工作的假设的 C# 编译器中的更改的组合引起的。我认为 JIT 错误存在于 .NET 4.0 中,但被 .NET 4.5 的编译器更改发现了。
我不认为beforefieldinit
是这里唯一的问题。我认为它比那更简单。
型号System.String
在 .NET 4.0 的 mscorlib.dll 中包含一个静态构造函数:
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// Code size 11 (0xb)
.maxstack 8
IL_0000: ldstr ""
IL_0005: stsfld string System.String::Empty
IL_000a: ret
} // end of method String::.cctor
String.cctor
(静态构造函数)明显不存在:
..... No static constructor :( .....
String
类型饰有
beforefieldinit
:
.class public auto ansi serializable sealed beforefieldinit System.String
.cctor
),但我无法做到。所有这些类型都有一个
.cctor
IL中的方法:
public class MyString1 {
public static MyString1 Empty = new MyString1();
}
public class MyString2 {
public static MyString2 Empty = new MyString2();
static MyString2() {}
}
public class MyString3 {
public static MyString3 Empty;
static MyString3() { Empty = new MyString3(); }
}
String.Empty
来自非托管代码。此更改可能是针对 .NET 4.0 进行的。
String.Empty
将从非托管端分配。此更改似乎是针对 .NET 4.5 进行的。
String.Empty
很快就会沿着一些优化路径。对编译器所做的更改(或任何使
String.cctor
消失的更改)预期 EE 在任何用户代码执行之前进行此分配,但似乎 EE 在
String.Empty
之前并未进行此分配。用于引用类型具体化泛型类的方法。
System.String
的特例。 ,但我怀疑 JIT 在这里为
System.String
做了一个特例。 .
String
现在使用线程静态缓存执行方法
StringBuilder
对象。
StringBuilder
未用于
Trim
代码路径,所以我决定它不可能是线程静态问题。
class A<T>
{
static A() { }
public A(out string s) {
s = string.Empty;
}
}
class B
{
static void Main() {
string s;
new A<object>(out s);
//new A<int>(out s);
System.Console.WriteLine(s.Length);
}
}
//new A<int>(out s);
在
Main
那么代码工作得很好。事实上,如果
A
被任何引用类型具体化,程序失败,但如果
A
用任何值类型具体化,那么代码不会失败。另外,如果您注释掉
A
的静态构造函数,代码永远不会失败。深入挖掘后
Trim
和
Format
,很明显,问题在于
Length
正在被内联,并且在这些示例中高于
String
类型尚未初始化。特别是
A
的 body 内部的构造函数,
string.Empty
未正确分配,尽管在
Main
的主体内,
string.Empty
被正确分配。
String
的类型初始化某种程度上取决于是否
A
用值类型具体化。我唯一的理论是,有一些优化的 JIT 代码路径用于在所有类型之间共享的泛型类型初始化,并且该路径对 BCL 引用类型(“特殊类型?”)及其状态做出假设。使用
public static
快速浏览其他 BCL 类字段表明,基本上所有这些都实现了静态构造函数(即使是那些具有空构造函数且没有数据的,如
System.DBNull
和
System.Empty
。具有
public static
字段的 BCL 值类型似乎没有实现静态构造函数(
System.IntPtr
,例如)。这似乎表明 JIT 对 BCL 引用类型初始化做了一些假设。
A<object>.ctor(out string)
:
public A(out string s) {
00000000 push rbx
00000001 sub rsp,20h
00000005 mov rbx,rdx
00000008 lea rdx,[FFEE38D0h]
0000000f mov rcx,qword ptr [rcx]
00000012 call 000000005F7AB4A0
s = string.Empty;
00000017 mov rdx,qword ptr [FFEE38D0h]
0000001e mov rcx,rbx
00000021 call 000000005F661180
00000026 nop
00000027 add rsp,20h
0000002b pop rbx
0000002c ret
}
A<int32>.ctor(out string)
:
public A(out string s) {
00000000 sub rsp,28h
00000004 mov rax,rdx
s = string.Empty;
00000007 mov rdx,12353250h
00000011 mov rdx,qword ptr [rdx]
00000014 mov rcx,rax
00000017 call 000000005F691160
0000001c nop
0000001d add rsp,28h
00000021 ret
}
Main
) 是相同的。
A.ctor
外是相同的。在
B.Main()
,其中第一个版本的 IL 包含:
newobj instance void class A`1<object>::.ctor(string&)
... A`1<int32>...
A<int>.ctor(out string)
: 与非通用版本中的相同。
关于c# - .NET 4.5 beta 中出现 FatalExecutionEngineError 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11873798/
我收到以下错误: Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\Users
今天我正在调试我的一些代码,这些代码构建了一些 ExpressionTrees,将它们编译为可调用的委托(delegate),然后在需要时调用它们。在执行此操作时,我遇到了 FatalExecutio
我在尝试将许多 DBase IV 文件中的 memofields 中的 C++ 结构读取到 C# (.Net 4) 中,然后将它们插入 MSSQL 2008 中时遇到了问题。数据正在从 DBase 文
这是我得到执行错误的行: NimbieImportedFunctions.BS_Robots_Connect( out robotCount, out robotIDs, out robotT
当我调试 ASP.NET MVC 应用程序时,KeyVaultClient 随机抛出异常: Managed Debugging Assistant 'FatalExecutionEngineError
托管调试助手“FatalExecutionEngineError”:“运行时遇到 fatal error 。错误的地址是 0x641ad419,在线程 0x5d0c 上。错误代码是 0xc000000
我需要在 C# 中使用 win32 NetLocalGroupGetMembers。我找到并测试了三种解决方案。这三个都因 FatalExecutionEngineError 而失败。框架是.net
我正在用 C# 例程试验一个我无法解决的乏味问题。我正在开发一个应用程序,它使用 GDAL 库(一个用 C++ 编写的 DLL 库来操作地理数据)打开 ESRI ShapeFile,并在 Pictur
几周(几个月?)以来,在 Visual Studio 2017/2019 Enterprise 中重新启动我的 ASP.NET 应用程序后,我有时会遇到以下异常。只有当 IIS Express 已经在
我正在开发一个连接到 MySQL 数据库的 C#.NET 应用程序,并使用一些不安全的代码来使用旧的 C++ dll。 程序一启动,就会加载dll并分配一个指针,然后初始化一些C#变量,然后删除指针。
作为我论文的一部分,我正在开发一个客户端/服务器应用程序,并选择使用 SocketAsyncEventArgs 来获得网络操作方面的最大性能。今天下午,我决定对创建 20 个线程并为每个线程发送 10
在我的程序中这一行: int value = MTEConnect(auth_string, err); 我收到这样的异常: FatalExecutionEngineError The runtime
我们正在使用一个封装数值的结构,我发现当在表达式中使用该结构的可空版本时,会发生 FatalExecutionEngineError: Additional information: The runt
我即将为用 VBScript 编写的遗留系统启动一个正在工作的迁移项目。它有一个有趣的结构,其中大部分是通过将各种组件编写为“WSC”文件来隔离的,这实际上是一种以类似 COM 的方式公开 VBScr
我正在研究无锁堆栈和队列数据结构,我可以在其中放置任意数量的添加项目并在一次调用中收集所有项目,我认为我的设计是可靠的并且它按预期工作直到我开始收到一个意外的异常,我认为这在纯 C# 环境中是不可能的
在 AnyCPU 或 x86 上,我可以运行这个程序,在 Foo 上设置一个断点,将第一个参数从 0.5f 编辑到 0.6f,然后恢复就好了。 但是,在 x64 上,它在恢复时始终因 FatalExe
我有以下基本 XAML: 当我尝试关闭包含用户控件的选项卡时,出现以下错误: Managed Debugging Assistant 'FatalExecut
这个问题不太可能对任何 future 的访客有帮助;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于互联网的全局受众。如需帮助使这个问题更广泛适用,visit the h
当我尝试调试我的项目时,我不断收到此错误消息。相同的代码适用于大学机器。我目前使用 Windows 8.1 和 resharper 8.2,并在 selenium 测试中使用了最初的几种方法。我也在使
我正在尝试(为了好玩)将 String.Empty 重新定义为单个空格“”。为什么这会破坏 CLR 框架? 留言: The runtime has encountered a fatal error.
我是一名优秀的程序员,十分优秀!