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

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

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

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

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

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

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

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

How can I determine using commercial or open source tools exactly what is holding a reference to Foo?

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

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