Debugowanie przecieków pamięci .NET - jak wiedzieć, co zawiera odniesienie do czego?

Pracuję nad aplikacją .NET, w której występuje przeciek pamięci. Wiem, że odpowiedzi w podręczniku, że zdarzenia powinny być wypisane, przedmioty jednorazowego użytku powinny być usuwane itd ...

Mam wiązkę testową, która może odtworzyć błąd. W finalizatorze pewnej klasy piszę do konsoli

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

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

W uprzęży testowej tworzę pojedynczą instancję Foo (która z kolei tworzy setki innych typów i współdziała z nimi), a następnie usuwa ją i wywołuje zbieracz śmieci.

Znajduję, że Foo Finalizer nigdy nie jest wywoływany. Mam podobną klasę z tą konfiguracją, która jest sfinalizowana jako test kontrolny.

Więc moje pytanie brzmi:

Jak mogę określić, za pomocą narzędzi komercyjnych lub open source, co dokładnie zawiera odnośnik do Foo?

Mam profesjonalną licencję na profilera pamięci dotTrace, ale nie mogę dowiedzieć się z plików pomocy, jak go używać.

Aktualizacja: Teraz używamdotMemory 4.0, która jest następcą (dobrej, ale bezużytecznej) pamięci dotTrace 3.5.