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.

questionAnswers(5)

yourAnswerToTheQuestion