第一个命令显示了网络进程的内存转储中数组的元素。当我尝试使用第二个命令查看存储在索引0处的每个元素中的实际字符时,它会失败。例如,如果数组包含'f','o','o'作为前三个字符,我想要一个在屏幕上显示'f'的命令。
0:000> !da -length 3 0000000001f11af8
Name: System.Char[]
MethodTable: 000007fef77e9688
EEClass: 000007fef73eef58
Size: 74(0x4a) bytes
Array: Rank 1, Number of elements 25, Type Char
Element Methodtable: 000007fef77e97d8
[0] 0000000001f11b08
[1] 0000000001f11b0a
[2] 0000000001f11b0c
0:000> !do 0000000001f11b08
<Note: this object has an invalid CLASS field>
Invalid object
答案 0 :(得分:2)
sos.dumpobj
用于转储托管对象,或者更具体地说是从System.Object扩展(直接或间接)的东西。 char(或System.Char)是一个valuetype,它从System.ValueType扩展而不是System.Object。
要转储valuetype,您可以使用命令!sos.dumpvc <MT> <address>
。 MT(方法表)在上面给出为000007fef77e97d8,因此要转储每个值,您将执行以下操作:
!sos.dumpvc 000007fef77e97d8 0000000001f11b08
!sos.dumpvc 000007fef77e97d8 0000000001f11b0a
!sos.dumpvc 000007fef77e97d8 0000000001f11b0c
这将产生如下内容:
Name: System.Char
MethodTable 000007fef77e97d8
EEClass: 000007feea37f018
Size: 24(0x18) bytes
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
MT Field Offset Type VT Attr Value Name
000007fef77e97d8 400021e 0 System.Char 1 instance 66 m_value
值66是&#39; f&#39;的十六进制值。另请注意VT列。这表明这是一种值类型。
更智能的选项是sosex.mdt
。如果您没有SOSEX,可以获得它here。在许多选项中,-e参数按指定的多个级别扩展集合类型(例如数组)。您可以将其用作sosex.mdt -e:1 <address>
。在这种情况下,地址将是数组,或0000000001f11af8。输出看起来像这样:
!sosex.mdt -e:1 0000000001f11af8
0000000001f11af8(System.Char[], Elements: 3)
[0] 'f'
[1] 'o'
[2] 'o'