Visual Studio 2013 can show a column for inclusive size (which includes size of child objects) - http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-e
DebugDiag 2 has totally been rewritten and is now a set of executables (EXE and DLL). It is no longer a set of scripts which you could easily modify to include additional information that you want to be there.
The output of DebugDiag is simiar to what you see in WinDbg+SOS's !dumpheap -stat
output:
...
575a4518 11547 560508 System.Object[]
575d37b8 91 892344 System.Byte[]
575d2ee4 3488 927512 System.Int32[]
575d0d48 72920 6939284 System.String
Total 120639 objects
SOS !do
gives only the size without children, but there is SOS !objsize
, which seems to include children (can't cross check with Visual Studio 2013, only have 2012):
0:008> !do 0b938584
Name: SomeClass
MethodTable: 08947c0c
EEClass: 08956c38
Size: 292(0x124) bytes
...
0:008> !objsize 0b938584
sizeof(0b938584) = 11728 ( 0x2dd0) bytes (SomeClass)
To do that for all objects on the heap, you can execute !objsize
for each object in a loop:
.foreach (address {!dumpheap -short}) {!objsize ${address}}
The only command I know that lists property values recursively is SOSEX's !mdt -r
, but it will not output the size.
Starting point for a Pykd script:
0:000> .loadby sos clr; .loadby sos mscorwks
0:000> .load \sosex.dll
0:000> .load \pykd.pyd
0:000> !pycmd
>>> gch = dbgCommand("!gch")
>>> lines = gch.split('\n')
>>> for line in lines: dprint(dbgCommand("!objsize "+line[34:50]))
...
Press Enter after ...
appears. Note that [34:50]
this might need to be adapter for 32 bit.