Как отладить сборку мусора .net? - PullRequest
10 голосов
/ 17 февраля 2009

Можно ли посмотреть на все .net объекты, которые собираются при вызове GC.Collect ()?

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

Ответы [ 2 ]

8 голосов
/ 17 февраля 2009

Я нашел, что лучший способ сделать это - использовать windbg и расширение SOS (son of strike). У него довольно загадочная командная строка, но она очень мощная. Он имеет возможность выгружать кучу и делить ее на кучу поколений GC. Как только вы пройдете начальную кривую обучения, очень легко отследить, какие объекты живы в какой части кучи. Вот несколько сайтов с примерами использования SOS

РЕДАКТИРОВАТЬ ОП спросил о местонахождении sos.dll. Он включен в установку .Net Framework. Он расположен на

% WINDIR% \ Microsoft.Net \ Framework \ V2.0.50727 \ SOS.dll

Но как только вы загрузили windbg, вам не нужен полный путь. Только нам метод .loadby.

.loadby sos mscorwks.dll

Она будет искать версию sos в том же каталоге, что и текущая версия mscorwks (CLR)

1 голос
/ 17 февраля 2009

Я использую SciTech's Memory profiler . Его немного сложно использовать, но есть несколько хороших обучающих видео. Это позволит вам увидеть, какие объекты расположены неправильно, в каком поколении они были собраны. Без него не удалось отладить утечки памяти ...

...