我注意到,如果我有以下代码并调用
System.Array
的 GetEnumerator
方法:
var array = new int[] { 1, 2, 3, 4 };
var arrayEnumerator = array.GetEnumerator();
arrayEnumerator.MoveNext();
同样的事情也发生在
List
的枚举器上,它不会停止在 List.Enumerator
ctor: 内部
var list = new List<int>();
var enumerator = list.GetEnumerator();
它不会停在我放入
ArrayEnumerator
的构造函数中的断点处:
我使用什么 IDE 并不重要 - Rider 和最新的 Visual Studio 2022(当然只是禁用了我的代码)的行为方式相同(检查了 .NET 6 和 7 运行时)。
我想这可能是由构造函数内联引起的,但检查 IL 显示事实并非如此。
如果我在像
ArrayEnumerator
这样的 MoveNext
方法中放置断点,它们就可以正常工作。
有趣的是,当我创建一个
Stack
时,它按预期工作并且Stack.Enumerator
内的断点被击中:
var stack = new Stack<int>();
stack.GetEnumerator();
作者的构造函数无法调试的问题是触发了执行
Suppress JIT optimization
选项的限制之一。
要调试的代码放置在使用预编译的本机代码构建的程序集中。要排除此类代码的启动,您应该指定
COMPlus_ReadyToRun=0
环境变量。
这里有详细解释https://learn.microsoft.com/en-us/visualstudio/debugger/jit-optimization-and-debugging