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.