windbg查看託管代碼數組中各個元素

轉自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。

 分析完畢,收工!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章