调试诊断
DebugDiag 2 已完全重写,现在是一组可执行文件(EXE 和 DLL)。它不再是一组您可以轻松修改以包含您想要的附加信息的脚本。
DebugDiag 的输出与您在 WinDbg+SOS 中看到的类似!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 <address>
只给出没有孩子的尺寸,但是有SOS!objsize <address>
,其中似乎包括子项(无法与 Visual Studio 2013 交叉检查,只有 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)
要对堆上的所有对象执行此操作,您可以执行!objsize
对于循环中的每个对象:
.foreach (address {!dumpheap -short}) {!objsize ${address}}
我知道的唯一递归列出属性值的命令是 SOSEX!mdt <address> -r
,但不会输出尺寸。
仅使用 Pykd 分析根对象
的起点Pykd script:
0:000> .loadby sos clr; .loadby sos mscorwks
0:000> .load <full path>\sosex.dll
0:000> .load <full path>\pykd.pyd
0:000> !pycmd
>>> gch = dbgCommand("!gch")
>>> lines = gch.split('\n')
>>> for line in lines: dprint(dbgCommand("!objsize "+line[34:50]))
...
之后按 Enter 键...
出现。注意[34:50]
这可能需要 32 位适配器。