轉自http://www.cnblogs.com/wordmy/archive/2009/02/24/1397144.html
原文: Arrays and SOS
注意:這是在X86上調試的,如果是在IA64/AMD64上調試,數組的格式會有些許區別(比如內存地址將會是64位而不是文章中的32位)。
預備工作:創建三個數組
string[] strs = new string[] { "String 1", "String 2", "String 3" };
int[] ints = new int[] { 21, 22, 23, 24, 25, 26, 27 };
double[] fps = new double[] { 3.14 };
首先,用 !sos.dso命令獲取這些數組的地址
0:000> !sos.dso
ESP/REG Object Name
0012ec94 00ac2ad8 System.Double[]
0012eca8 00ac2a88 System.Object[]
0012ecac 00ac2aa4 System.Int32[]
(自語:數組元素是值類型(自定義的結構體)的場合,輸出的都是該類型的數組形式,如System.Double[];元素是引用類型的場合,則以 System.Object[]形式出現。)
接着,用!do命令獲取該數組的類型信息
0:000> !do 00ac2aa4
Name: System.Int32[]
MethodTable: 5b9ca974
EEClass: 5ba4d4ec
Size: 40(0x28) bytes
Array: Rank 1, Type Int32
Element Type: System.Int32
Fields:
None
OK,這是Int32型的數組,每個子元素佔4字節。由於!do只能查看數組對象本身的信息,不能深入到其子元素,所以這裏用到dd命令
0:000> dd 00ac2aa4
00ac2aa4 5b9ca974 00000007 00000015 00000016
00ac2ab4 00000017 00000018 00000019 0000001a
00ac2ac4 0000001b 00010000 5b9938b0 00000000
00ac2ad4 00010000 5b9c9b18 00000001 51eb851f
00ac2ae4 40091eb8 00010000 5b9b2be0 00000006
00ac2af4 00000000 00000080 00010000 5b9c6614
00ac2b04 00000001 5b9938b0 00ac2aec 00010000
00ac2b14 5b9b2c8c 00000080 00010000 5b9b413c
首列是序號,顯示的是該行起始的內存地址,可以看出,每行16字節,一列4字節。
着重說下高亮顯示的那幾條數據。綠色的那條是該數組的方法表,如果之前沒用!do命令查看數組信息的話,可以用!dumpmt命令查看一下
0:000> !dumpmt 5b9ca974
EEClass: 5ba4d4ec
Module: 5b918000
Name: System.Int32[]
mdToken: 02000000 (C:"WINNT"Microsoft.NET"Framework"v2.0.40428"assembly"GAC_32"mscorlib"2.0.3600.0__b77a5c561934e089"mscorlib.dll)
BaseSize: 0xc
ComponentSize: 0x4
Number of IFaces in IFaceMap: 4
Slots in VTable: 25
黃色的這條告訴我們這個數組有多少子元素,這裏顯示的是7個,Int32是4字節(一個Int32用一列表示),黃條後面的7個紅條條保存的就是該數組7個子元素的值(21-27)。
*這裏的數值是用16進製表示,所以15對應的是十進制的21。
然後,我們分析double[]型的。一個double佔8字節(一個Double需要二列表示)。
0:000> dd 00ac2ad8
00ac2ad8 5b9c9b18 00000001 40091eb8 51eb851f
00ac2ae8 00010000 5b9b2be0 00000006 00000000
00ac2af8 00000080 00010000 5b9c6614 00000001
00ac2b08 5b9938b0 00ac2aec 00010000 5b9b2c8c
00ac2b18 00000080 00010000 5b9b413c 00ac2b80
00ac2b28 00010100 00000000 00010000 5b9b4668
00ac2b38 00000000 00000009 0000000a 00010000
00ac2b48 5b9c6614 0000000a 5b9938b0 00000000
老樣子,綠條條是該數組的方法表,黃條條表示該數組只有1個子元素。前面也說了,是double型的,要8字節,需要2列合起來表示一個double。
0X40091eb851eb851f,反正我是看不出這個值是多少,藉助命令.formats
0:000> .formats 40091eb851eb851f Evaluate expression:
Hex: 40091eb8`51eb851f
Decimal: 4614253070214989087
Octal: 0400110753412172702437
Binary: 01000000 00001001 00011110 10111000 01010001 11101011 10000101 00011111
Chars: @...Q...
Time: Fri Dec 27 09:23:41.498 16222 (GMT-7)
Float: low 1.26444e+011 high 2.1425
Double: 3.14
結果出來了,3.14。
最後,分析object[]。老樣子,dd
0:000> dd 00ac2a88
00ac2a88 5b9c6614 00000003 5b99452c 00ac2a1c
00ac2a98 00ac2a40 00ac2a64 00010000 5b9ca974
00ac2aa8 00000007 00000015 00000016 00000017
00ac2ab8 00000018 00000019 0000001a 0000001b
00ac2ac8 00010000 5b9938b0 00000000 00010000
00ac2ad8 5b9c9b18 00000001 51eb851f 40091eb8
00ac2ae8 00010000 5b9b2be0 00000006 00000000
00ac2af8 00000080 00010000 5b9c6614 00000001
這個數組有3個子元素。這裏有個問題,到目前爲止只知道這是個object,具體什麼類型一無所知,天無絕人之路,紫條條的就是元素的方法表(與綠條條object的方法表不同)。接着就用!dumpmt查看該元素的類型。
0:000> !dumpmt 5b99452c
EEClass: 5b9d7f10
Module: 5b918000
Name: System.String
mdToken: 02000027 (C:"WINNT"Microsoft.NET"Framework"v2.0.40428"assembly"GAC_32"mscorlib"2.0.3600.0__b77a5c561934e089"mscorlib.dll)
BaseSize: 0x10
ComponentSize: 0x2
Number of IFaces in IFaceMap: 5
Slots in VTable: 190
很明顯,這是String型的。由於是string型的,後面3個紅條條保存的是內存地址,這裏要用 !do命令查看具體的值了。
0:000> !do 00ac2a1c
Name: System.String
MethodTable: 5b99452c
EEClass: 5b9d7f10
Size: 34(0x22) bytes
(C:"WINNT"Microsoft.NET"Framework"v2.0.40428"assembly"GAC_32"mscorlib"2.0.3600.0__b77a5c561934e089"mscorlib.dll)
String: String 1
0:000> !do 00ac2a40
Name: System.String
MethodTable: 5b99452c
EEClass: 5b9d7f10
Size: 34(0x22) bytes
(C:"WINNT"Microsoft.NET"Framework"v2.0.40428"assembly"GAC_32"mscorlib"2.0.3600.0__b77a5c561934e089"mscorlib.dll)
String: String 2
0:000> !do 00ac2a64
Name: System.String
MethodTable: 5b99452c
EEClass: 5b9d7f10
Size: 34(0x22) bytes
(C:"WINNT"Microsoft.NET"Framework"v2.0.40428"assembly"GAC_32"mscorlib"2.0.3600.0__b77a5c561934e089"mscorlib.dll)
String: String 3
如上所示,分別是String 1,String 2,String 3。
分析完畢,收工!