Depuração de vazamentos de memória .NET - como saber o que está mantendo uma referência a quê?
Eu estou trabalhando em um aplicativo .net onde parece haver um vazamento de memória. Eu sei que o livro-texto responde, que os eventos devem ser descadastrados, objetos descartáveis devem ser descartados, etc ...
Eu tenho um equipamento de teste que pode reproduzir o erro. No finalizador de uma certa classe eu escrevo para console
public class Foo
{
// Ctor
public Foo()
{
}
~public Foo()
{
Console.WriteLine("Foo Finalized");
}
}
No harness de teste, estou criando uma única instância do Foo (que, por sua vez, cria e interage com centenas de outros tipos), removendo-a e chamando o Garbage collector.
Eu estou achando que o Finalizador Foo nunca é chamado. Eu tenho uma classe semelhante com esta configuração que é finalizada como um teste de controle.
Então minha pergunta é esta:
Como posso determinar usando ferramentas comerciais ou de código aberto exatamente o que está mantendo uma referência ao Foo?
Eu tenho uma licença profissional para profiler de memória dotTrace, mas não consigo descobrir a partir dos arquivos de ajuda como usá-lo.
Atualizar: Agora estou usandodotMemory 4.0, que é o sucessor do (bom, mas inutilizável) dotTrace Memory 3.5.