结构构造函数断点未在外部代码中命中

Struct constructor breakpoints not getting hit in external code

提问人:user5539357 提问时间:10/7/2023 最后编辑:user5539357 更新时间:10/7/2023 访问量:47

问:

我注意到,如果我有以下代码并调用 的方法:System.ArrayGetEnumerator

    var array = new int[] { 1, 2, 3, 4 };
    var arrayEnumerator = array.GetEnumerator();
    arrayEnumerator.MoveNext();

同样的事情发生在 的枚举器上,它不会在 ctor 内部停止:ListList.Enumerator

    var list = new List<int>();
    var enumerator = list.GetEnumerator();

jj

它不会停在我放入构造函数的断点处:ArrayEnumerator

enter image description here

我使用什么 IDE 并不重要 - Rider 和最新的 Visual Studio 2022(当然只禁用了我的代码)的行为方式相同(检查了 .NET 6 和 7 运行时)。

我在想这可能是由构造函数内联引起的,但检查 IL 表明情况并非如此。

enter image description here

如果我在这样的方法中放置断点,它们就可以正常工作。ArrayEnumeratorMoveNext

enter image description here

有趣的是,当我创建一个 时,它按预期工作,并且内部的断点被命中:StackStack.Enumerator

    var stack = new Stack<int>();
    stack.GetEnumerator();
C# .NET 调试 断点

评论

0赞 shingo 10/7/2023
MoveNext没有显示在您的代码中,实际代码是什么样子的?如果在第二行设置断点,然后单步执行,会发生什么?
0赞 user5539357 10/7/2023
@shingo更新
0赞 Nikolay 10/7/2023
您遵循了此处的建议 learn.microsoft.com/en-us/aspnet/core/test/...
0赞 user5539357 10/7/2023
@Nikolay是的,我什至尝试过其他组合,但没有运气。
0赞 shingo 10/7/2023
你还没有回答我的第二个问题,你能进入构造函数吗?array.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 的详细说明