DebugDiag 能否像 Visual Studio 2013 一样生成具有“包含大小”的报告

2023-11-30

Visual Studio 2013 可以显示包含大小的列(其中包括子对象的大小) -http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/net-memory-analysis-enhancements-in-visual-studio-2013.aspx

DebugDiag 的内存分析报告目前仅显示对象大小,不包括子对象。有没有办法让 DebugDiag 在其报告中包含子对象的大小?

您建议什么是为 .NET 4.0 生成此类报告的好方法,因为 Visual Studio 仅支持分析 .NET 4.5 故障转储

inclusive size


调试诊断

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 位适配器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DebugDiag 能否像 Visual Studio 2013 一样生成具有“包含大小”的报告 的相关文章

随机推荐