提问人:user5539357 提问时间:10/7/2023 最后编辑:user5539357 更新时间:10/7/2023 访问量:47
结构构造函数断点未在外部代码中命中
Struct constructor breakpoints not getting hit in external code
问:
我注意到,如果我有以下代码并调用 的方法:System.Array
GetEnumerator
var array = new int[] { 1, 2, 3, 4 };
var arrayEnumerator = array.GetEnumerator();
arrayEnumerator.MoveNext();
同样的事情发生在 的枚举器上,它不会在 ctor 内部停止:List
List.Enumerator
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();
答:
1赞
Nikolay
10/7/2023
#1
作者的构造函数无法用于调试的问题在于触发了执行该选项的限制之一。Suppress JIT optimization
要调试的代码放置在使用预编译的本机代码生成的程序集中。若要排除此类代码的启动,应指定环境变量。COMPlus_ReadyToRun=0
以下是 https://learn.microsoft.com/en-us/visualstudio/debugger/jit-optimization-and-debugging 的详细说明
评论
MoveNext
没有显示在您的代码中,实际代码是什么样子的?如果在第二行设置断点,然后单步执行,会发生什么?array.GetEnumerator