2014-02-06 53 views
3

我寫了一個簡單的C#應用​​程序:爲什麼SOS/SOSEx會誤解System.Collections.Generic.List.Enumerator的值?

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 

我得到的輸出顯然是錯誤的(領域都弄亂了,好像在「當前」,在價值報告「索引」的價值「當前的」下「版本」,而「下‘索引版本值’它得到了只有一個字段正確的 - 。第一個

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 

這是爲什麼發生?

+0

順便說一下:Visual Studio 2010顯示正確的非公共屬性,所以似乎有一種方法是正確的。 –

回答

3

問題是,CLR已經重新排列了枚舉器結構的封閉類型(int的枚舉數)的字段,以便它們與打開類型(T的枚舉器)不匹配。 Sosex使用開放類型來讀取字段而不是封閉類型。 sosex中的這個bug現在已經修復了。

相關問題