! dumpheap vs! strings - different number of records and different length of strings
Note:
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
Note that !dumpheap
it reports 16 lines in real time, while !strings
it only reports 4.
And their length is different.
Why?
source to share
I think I found the answer.
The 4 lines found both !strings
and dumpheap
are of different length, depending on which command is used:
Address Length by !dumpheap Length by !strings
0000009767ed96c8 212294 106134
0000009767f223e0 211356 105665
0000009767fa26f0 215062 107518
0000009767fd6f28 214124 107049
Where:
212294 = 106134 * 2 + 26
211356 = 105665 * 2 + 26
215062 = 107518 * 2 + 26
214124 = 107049 * 2 + 26
So here is my hypothesis - !dumpheap
reports the raw size of .NET strings - which means it doubles the number of characters and adds any additional fields to the string object. The commands !strings
simply return the number of characters in the lines.
source to share