使用Windbg转储阵列

使用Windbg转储阵列,windbg,crash-dumps,sos,Windbg,Crash Dumps,Sos,在C#中,有一个对象称为Shape,它有两个字段area和length 我得到了一个形状列表,它是形状的集合 我的崩溃转储中有一个shapeList地址 我需要一个windbg脚本,它在shapeList数组中遍历每个项,并为每个形状单独显示区域的值。.for(r$t1=0;@$t1.for(r$t1=0;@$t1

在C#中,有一个对象称为
Shape
,它有两个字段
area
length

我得到了一个
形状列表
,它是形状的集合

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

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

.for(r$t1=0;@$t1<[length]*[element size];r$t1=@$t1+[element size];){!dopoi(poi(@$t1+poi([list的地址]+0x8)+0x18)+[parent object中子对象的偏移量)}
    .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
例如: 福班 { 公共栏MyBar{get;set;} } 分类栏 { 公共字符串MyString{get;set;} } 0:000>.for(r$t1=0;@$t1<0x5*0x8;r$t1=@$t1+0x8;){!执行poi(poi(@$t1+poi(000000000 2362E40+0x8)+0x18)+0x8)} 名称:testdebug.Bar 方法表:000007fe95eb3928 EEClass:000007fe95fc22d8 大小:24(0x18)字节 文件:C:\users\testdebug.exe 领域: MT字段偏移类型VT属性值名称 000007fef47b4130 4000002 8系统。字符串0实例000000000 23653B0 k__BackingField 名称:testdebug.Bar 方法表:000007fe95eb3928 EEClass:000007fe95fc22d8 大小:24(0x18)字节 文件:C:\users\testdebug.exe 领域: MT字段偏移类型VT属性值名称 000007fef47b4130 4000002 8系统。字符串0实例000000000 2365468 k___BackingField 名称:testdebug.Bar 方法表:000007fe95eb3928 EEClass:000007fe95fc22d8 大小:24(0x18)字节 文件:C:\users\testdebug.exe 领域: MT字段偏移类型VT属性值名称 000007fef47b4130 4000002 8系统。字符串0实例000000000 2365520 k__BackingField 名称:testdebug.Bar 方法表:000007fe95eb3928 EEClass:000007fe95fc22d8 大小:24(0x18)字节 文件:C:\users\testdebug.exe 领域: MT字段偏移类型VT属性值名称 000007fef47b4130 4000002 8系统。字符串0实例000000000 23655D8 k__BackingField 名称:testdebug.Bar 方法表:000007fe95eb3928 EEClass:000007fe95fc22d8 大小:24(0x18)字节 文件:C:\users\testdebug.exe 领域: MT字段偏移类型VT属性值名称 000007fef47b4130 4000002 8系统。字符串0实例000000000 2365690 k___BackingField
您看过安装附带的windbg文档了吗?在.chm文件中有一些非常好的脚本说明。元素大小和长度之间有什么区别?如何在父对象中找到子对象的偏移量?元素大小是列表中元素的大小,因此如果它是引用类型(与类类似),它是8字节(如果是32位,则为4字节)。长度是数组的大小(即列表对象上的大小)。