Как перечислить все управляемые объекты в куче в .Net?

Можно ли перечислить все объекты, хранящиеся в куче. Я хотел бы сделать что-то вроде этого:

IEnumerable<GCHandle> listOfObjectsInHeap = GetListOfObjectsFromHeap();

Ответ 1

Для этого вы можете использовать API профилирования. К сожалению, не в управляемом коде.

Ответ 2

Используя библиотеку ClrMD, вы можете подключиться к своему собственному процессу и проверить кучу.

Однако использование ClrMD в отношении запущенного процесса, как известно, ограничивает доступную информацию, поскольку куча может меняться, когда вы пытаетесь ее пропустить.

http://blogs.msdn.com/b/dotnet/archive/2013/05/01/net-crash-dump-and-live-process-inspection.aspx

Ответ 3

Мне не известно о какой-либо управляемой функции, которая позволяет вам это делать. Вы можете получить эту информацию, используя функцию HeapWalk. Вот пример его использования (он создает новую кучу, но вы можете получить текущую кучу процесса с GetProcessHeap).