gpt4 book ai didi

windbg - 为什么 SOS/SOSEx 会误解 System.Collections.Generic.List.Enumerator 的值?

转载 作者:行者123 更新时间:2023-12-02 08:48:59 24 4
gpt4 key购买 nike

我编写了一个简单的 C# 应用程序:

   static void Main(string[] args)
{
var list = new List<int> {500,400,300,200,100};
var listEnumerator = list.GetEnumerator();
listEnumerator.MoveNext();
} // <--- breakpoint here

我在末尾放置了一个断点,使用 Visual Studio 运行它,然后启动 Windbg 并附加到该进程(打开“非侵入”复选框)。

然后我输入了这些命令:

.load C:\Program Files (x86)\Windows Kits\8.0\Debuggers\x86\sosex.dll
!mframe 17
!mdt listEnumerator

我得到的输出显然是错误的(字段都乱七八糟,似乎报告了“current”下“index”的值、“version”下“current”的值以及“version”的值在“index”下。它只有一个字段是正确的 - 第一个字段。

Local #0: (System.Collections.Generic.List`1+Enumerator) VALTYPE (MT=72dfd838, ADDR=0029efb8)
list:02632464 (System.Collections.Generic.List`1[[System.Int32, mscorlib]])
index:0x5 (System.Int32)
version:0x1f4 (System.Int32)
current:00000001 (T)

然后我尝试使用 SOS 的 !DumpVC 代替,并得到了同样的困惑:

    0:000> !DumpVC 72dfd838 0029efb8
Name: System.Collections.Generic.List`1+Enumerator
MethodTable: 72dfd838
EEClass: 72a32d38
Size: 24(0x18) bytes
File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
MT Field Offset Type VT Attr Value Name
736ae16c 4000c99 0 ...Generic.List`1[T] 0 instance 02632464 list
72e03aa4 4000c9a 8 System.Int32 1 instance 5 index
72e03aa4 4000c9b c System.Int32 1 instance 500 version
00000000 4000c9c 4 VAR 0 instance 00000001 current

为什么会发生这种情况?

最佳答案

问题在于 CLR 已对封闭类型(int 的枚举器)的枚举器结构的字段进行了重新排序,以便它们与开放类型(T 的枚举器)不匹配。 Sosex 使用开放类型而不是封闭类型来读取字段。 sosex 中的此错误现已修复。

关于windbg - 为什么 SOS/SOSEx 会误解 System.Collections.Generic.List.Enumerator 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21613938/

24 4 0