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

问题描述 投票:0回答:1

我注意到,如果我有以下代码并调用

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();
c# .net debugging breakpoints
1个回答
0
投票

作者的构造函数无法调试的问题是触发了执行

Suppress JIT optimization
选项的限制之一。

要调试的代码放置在使用预编译的本机代码构建的程序集中。要排除此类代码的启动,您应该指定

COMPlus_ReadyToRun=0
环境变量。

这里有详细解释https://learn.microsoft.com/en-us/visualstudio/debugger/jit-optimization-and-debugging

© www.soinside.com 2019 - 2024. All rights reserved.