Может ли DebugDiag генерировать отчеты с "инклюзивным размером", как Visual Studio 2013

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

включающий размер

1 ответ

DebugDiag

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

Другие подходы

СОС !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-битных.

Другие вопросы по тегам