2012-04-25 59 views
1

在C#中,我有一个对象说Shape其中有两个字段arealength使用Windbg倾倒数组

我得到了一个shapeList这是一个形状的集合。

我的崩溃转储中有一个shapeList地址。

我需要一个windbg脚本,遍历shapeList数组中的每个项目,并为每个形状单独显示area的值。

+1

你看过包含在安装中的windbg文档吗?在.chm文件中有一些非常好的脚本说明。 – Chris 2012-04-25 18:01:20

回答

3
.for (r $t1 = 0; @$t1 < [length] * [element size]; r $t1 = @$t1 + [element size];) {!do poi(poi(@$t1+poi([address of list]+0x8)+0x18)+[offset of child object in parent object) } 

    For example: 

    class Foo 
     { 
      public Bar MyBar { get; set; } 
     } 

     class Bar 
     { 
      public String MyString { get; set; } 
     } 

0:000> .for (r $t1 = 0; @$t1 < 0x5 * 0x8; r $t1 = @$t1 + 0x8;) {!do poi(poi(@$t1+poi(0000000002362e40+0x8)+0x18)+0x8) } 
Name:  testdebug.Bar 
MethodTable: 000007fe95eb3928 
EEClass:  000007fe95fc22d8 
Size:  24(0x18) bytes 
File:  C:\users\testdebug.exe 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef47b4130 4000002  8  System.String 0 instance 00000000023653b0 <MyString>k__BackingField 
Name:  testdebug.Bar 
MethodTable: 000007fe95eb3928 
EEClass:  000007fe95fc22d8 
Size:  24(0x18) bytes 
File:  C:\users\testdebug.exe 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef47b4130 4000002  8  System.String 0 instance 0000000002365468 <MyString>k__BackingField 
Name:  testdebug.Bar 
MethodTable: 000007fe95eb3928 
EEClass:  000007fe95fc22d8 
Size:  24(0x18) bytes 
File:  C:\users\testdebug.exe 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef47b4130 4000002  8  System.String 0 instance 0000000002365520 <MyString>k__BackingField 
Name:  testdebug.Bar 
MethodTable: 000007fe95eb3928 
EEClass:  000007fe95fc22d8 
Size:  24(0x18) bytes 
File:  C:\users\testdebug.exe 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef47b4130 4000002  8  System.String 0 instance 00000000023655d8 <MyString>k__BackingField 
Name:  testdebug.Bar 
MethodTable: 000007fe95eb3928 
EEClass:  000007fe95fc22d8 
Size:  24(0x18) bytes 
File:  C:\users\testdebug.exe 
Fields: 
       MT Field Offset     Type VT  Attr   Value Name 
000007fef47b4130 4000002  8  System.String 0 instance 0000000002365690 <MyString>k__BackingField 
+0

元素大小和长度有什么区别?我如何找到父对象中子对象的偏移量? – Rockstart 2012-04-26 06:21:56

+0

元素大小是列表中元素的大小,因此如果它是引用类型(如类),则为8个字节(如果是32位,则为4)。长度是数组的大小(即列表对象上的_size)。 – 2012-04-26 11:39:19