【问题标题】:Why do SOS/SOSEx misinterpret the values of a System.Collections.Generic.List.Enumerator?为什么 SOS/SOSEx 会误解 System.Collections.Generic.List.Enumerator 的值?
【发布时间】:2014-02-06 21:00:06
【问题描述】:

我写了一个简单的 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'的值在“索引”下。它只有一个字段正确 - 第一个字段。

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

为什么会这样?

【问题讨论】:

  • 顺便说一句:Visual Studio 2010 正确显示了非公共属性,所以似乎有一种方法可以做到这一点。

标签: windbg sos sosex


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多