Как составить список всех объектов в списке финализации GC?
У меня сбой в моей программе, это визуализатор для VS, поэтому отладку очень сложно, я пытался создать дамп и использовать WinDbg для его изучения, но это не удалось.
Итак, теперь я пытаюсь программно заняться этим списком, но не знаю как. Благодарю.
2 ответа
Я не думаю, что есть способ попасть в очередь завершения через.NET Framework Framework Library (FCL). Я подозреваю, что если вы хотите сделать это программно, а не отладкой с помощью WinDbg, вам (так же, как WinDbg и аналогичным инструментам) потребуется использовать для этой цели неуправляемые API отладки и профилирования CLR.
Посмотрите на ICORDebugGCReferenceEnum
COM интерфейс. Вы можете получить на объект этого типа через ICorDebugProcess5::EnumerateGCReferences
:
Msgstr "Предоставляет перечислитель для объектов, которые будут собираться мусором."
"
COR_GC_REFERENCE
объекты в коллекции, заполненной [ICorDebugGCReferenceEnum::Next
метод ] представляют три вида объектов:
Объекты из всех управляемых стеков. Это включает в себя живые ссылки в управляемом коде, а также объекты, созданные общеязыковой средой исполнения.
Объекты из таблицы ручек. Это включает в себя сильные ссылки (
HNDTYPE_STRONG
а такжеHNDTYPE_REFCOUNT
) и статические переменные в модуле.Объекты из очереди финализатора. Очередь финализатора коренит объекты до тех пор, пока финализатор не запустится. "
(Гиперссылки и акценты добавлены мной.)
Каждый объект, возвращаемый перечислителем, имеет поле type
, Возможно, вы захотите отфильтровать объекты, для которых это поле соответствует значению CorGCReferenceType.CorReferenceFinalizer
,
Если вы хотите увидеть, находится ли объект в очереди завершения или f-достижимой очереди, при запуске WinDBG сначала найдите свой объект, используя dumpheap -stat
или любая другая команда. После того, как вы обнаружите адрес объекта, вы можете использовать !FinalizeQueue
который выведет, сколько объектов финализуемо в каждом поколении и сколько объектов готово к финализации. Первая - это очередь завершения, вторая - f-достижимая очередь.
Например:
0:003>! FinalizeQueue
SyncBlocks, которые будут очищены:0 Интерфейсы MTA, которые будут освобождены:0 Интерфейсы STA, которые будут освобождены:0
поколение 0 имеет 370 финализируемых объектов
(0000000000d29030->0000000000d29bc0)поколение 1 имеет 4 финализируемых объекта
(0000000000d29010->0000000000d29030)поколение 2 имеет 8 финализируемых объектов
(0000000000d28fd0->0000000000d29010)Готов к доработке 571 объектов
(0000000000d29bc0->0000000000d2ad98)
Теперь вы можете видеть, где находится адресное пространство ваших объектов.
Отличный учебник доступен здесь