Как составить список всех объектов в списке финализации 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)

Теперь вы можете видеть, где находится адресное пространство ваших объектов.

Отличный учебник доступен здесь

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