!dumpheap vs!strings - 报告字符串的不同条目数和不同长度

时间:2017-07-25 23:38:10

标签: windbg

请观察:

0:000> !dumpheap -min 0n100000 -mt 00007fff6c9c16b8 -live
         Address               MT     Size
0000009757e51038 00007fff6c9c16b8   116590     
0000009757e6d7c8 00007fff6c9c16b8   121392     
0000009757e8b218 00007fff6c9c16b8   160838     
0000009757eb2680 00007fff6c9c16b8   160826     
0000009757ed9ae0 00007fff6c9c16b8   179332     
0000009767e51038 00007fff6c9c16b8   121516     
0000009767e6eb08 00007fff6c9c16b8   129002     
0000009767e8e318 00007fff6c9c16b8   154506     
0000009767eb3ec8 00007fff6c9c16b8   153568     
0000009767ed96c8 00007fff6c9c16b8   212294     
0000009767f223e0 00007fff6c9c16b8   211356     
0000009767f55da0 00007fff6c9c16b8   157274     
0000009767f7c420 00007fff6c9c16b8   156336     
0000009767fa26f0 00007fff6c9c16b8   215062     
0000009767fd6f28 00007fff6c9c16b8   214124     
0000009777e71070 00007fff6c9c16b8   130594     

Statistics:
              MT    Count    TotalSize Class Name
00007fff6c9c16b8       16      2594610 System.String
Total 16 objects
0:000> !strings /n:100000
Address            Gen    Length   Value
---------------------------------------
0000009767ed96c8   LOH    106134   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767f223e0   LOH    105665   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767fa26f0   LOH    107518   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
0000009767fd6f28   LOH    107049   
                SET DEADLOCK_PRIORITY HIGH

                DECLARE @CommittedCommitStateId INT = (Select PR...
---------------------------------------
4 matching strings

请注意,!dumpheap报告了16个实时字符串,而!strings仅报告了4个。

他们的长度不同。

为什么?

1 个答案:

答案 0 :(得分:2)

我想我找到了答案。

!stringsdumpheap找到的4个字符串根据使用的命令具有不同的长度:

Address            Length by !dumpheap   Length by !strings         
0000009767ed96c8   212294                106134   
0000009767f223e0   211356                105665
0000009767fa26f0   215062                107518
0000009767fd6f28   214124                107049

其中:

212294 = 106134 * 2 + 26
211356 = 105665 * 2 + 26
215062 = 107518 * 2 + 26
214124 = 107049 * 2 + 26

所以,这是我的假设 - !dumpheap报告.NET字符串的原始大小 - 这意味着它将字符数增加一倍,并添加字符串对象的任何额外字段。 !strings命令只返回字符串中字符的计数。