Отладка утечек памяти .NET — как узнать, что содержит ссылку на что?

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

У меня есть тестовая программа, которая может воспроизвести ошибку. В финализаторе определенного класса я пишу в консоль

public class Foo
{
   // Ctor
   public Foo()
   {
   }

   ~public Foo()
   {
       Console.WriteLine("Foo Finalized");
   }
}

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

Я обнаружил, что Foo Finalizer никогда не вызывается. У меня есть аналогичный класс с этой настройкой, который дорабатывается как контрольный тест.

Итак, мой вопрос заключается в следующем:

Как я могу определить, используя коммерческие инструменты или инструменты с открытым исходным кодом, что именно держит ссылку на Foo?

У меня есть профессиональная лицензия на профайлер памяти dotTrace, но я не могу понять из файлов справки, как его использовать.

Обновление:Сейчас я использую dotMemory 4.0, которая является преемником (хорошей, но непригодной) dotTrace Memory 3.5.

7
задан Dr. ABT 2 June 2014 в 11:04
поделиться