【问题标题】:Can DebugDiag generate reports with "inclusive size" like Visual Studio 2013DebugDiag 可以像 Visual Studio 2013 那样生成“包含大小”的报告吗
【发布时间】:2014-08-11 15:41:06
【问题描述】:

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

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

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

【问题讨论】:

  • 它已经包含了子对象的大小,正如博文中所解释的那样。您必须对“子对象”有其他类型的定义,无法猜测它可能意味着什么。使用合适的内存分析器来获取更多信息。
  • @HansPassant:Visual Studio 包含子对象。 DebugDiag 没有。

标签: .net visual-studio-2013 windbg debugdiag clrmd


【解决方案1】:

调试诊断

DebugDiag 2 已完全重写,现在是一组可执行文件(EXE 和 DLL)。它不再是一组脚本,您可以轻松地对其进行修改以包含您想要的其他信息。

DebugDiag 的输出与您在 WinDbg+SOS 的!dumpheap -stat 输出中看到的类似:

...
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 脚本的起点:

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

【讨论】:

  • 你在哪里写 foreach 脚本?在windbg里面?
  • @sgarg:是的,启动 WinDbg,附加到进程,加载 .NET 的调试扩展 (.loadby sos mscorwks;.loadby sos clr),然后键入 .foreach ...
  • 有没有办法只遍历 SOS 中的根?我不想遍历堆中的每个对象。
  • 我无法让 SOS !FindRoots 工作。 SOS !gcroot &lt;address&gt; 列出了对象的根,但输出几乎不能用于执行其他任何操作,因为它非常不可预测。 SOSEX !gch 看起来更好,但也没有 short 选项,并且会导致问题,因为它输出以空格分隔的字符串值。结论:似乎没有内置函数是合适的。
  • 使用 PYKD 可以解析 SOSEX !gch 的输出。另一种选择是将.foreach 的输出写入文件,导入 Excel 并按大小排序。一些根对象必须是最大的对象,因为它们引用了其他所有对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2021-05-22
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多