2009-07-26 4 views
4

Возможно ли получить доступ к управляемой куче в приложении .NET и, например, перечислять объекты, которые в настоящее время распределены там?Могу ли я программно просматривать содержимое управляемой кучи из приложения .NET?

Я знаю, что есть различные инструменты, которые позволяют вам это делать, но я бы предпочел сделать это сам из кода, чтобы я мог использовать его в автоматизированных тестах, например, чтобы проверить, все ли утилизировано и очищено после закрытия форма.

+0

Независимо от того, что вы нашли, пожалуйста, разместите его. Это определенно будет полезно для других. – JoshJordan

ответ

2

http://sourceforge.net/projects/profilesharp/ имеет профилировщик с исходным кодом.

+0

К сожалению, ссылка мертва/ушла ... – Cohen

+1

Исправлена ​​ссылка ... Она находится в репозитории SourceForge. –

+0

К счастью: 0 фиксируется в репозитории SourceForge. – Cohen

1

Вы можете использовать CLR Profiler, чтобы увидеть эту информацию:

http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en

+1

Я знаю, но это не то, что мне нужно. Я хочу сделать это в своем собственном приложении C#, а не с помощью какого-либо внешнего интерактивного инструмента. Поэтому в основном я хочу знать, как сделать сам (часть), что делает CLR Profiler. – Timo

1

Единственный способ, кроме того, с помощью профилировщика, является с WinDbg и с расширением SOS загружены.

IIRC, вы звоните! EEHeap.

+0

Ну, если все эти профилировщики могут это сделать, то я думаю, что должен быть способ ... поэтому я хочу знать, как профайлер делает это :-) – Timo

+1

Посмотрите на .NET Profiling api. – leppie

1

Профайлеры (с использованием API профилирования) являются «внешними» компонентами (не совсем COM) в том смысле, что они загружаются CLR и имеют различные опции вызова вызываемого метода любого метода enter/leave/tail в управляемом кода (и много других вещей). Они написаны в неуправляемом коде.

AFAIK нет возможности получить эту информацию внутренне, не обращаясь к профилировщику/отладчику, который контролирует CLR. Также помните, что вы не всегда можете получить такую ​​информацию, поскольку она существует только после завершения вашего кода (многие вызовы Dispose(), завершение и т. Д.).

1

Теперь вы можете использовать пакет Nuget ClrMD.

Пакет Nuget на самом деле называется Microsoft.Diagnostics.Runtime. Это позволит вам просматривать объекты в куче, а также других свойств среды CLR.