如何在WinDBG中查看char数组中元素的值?

时间:2014-08-12 01:41:21

标签: .net char windbg

第一个命令显示了网络进程的内存转储中数组的元素。当我尝试使用第二个命令查看存储在索引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

1 个答案:

答案 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'
相关问题