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
這是爲什麼發生?
順便說一下:Visual Studio 2010顯示正確的非公共屬性,所以似乎有一種方法是正確的。 –