Depuración de fugas de memoria .NET: ¿cómo saber qué contiene una referencia a qué?

Estoy trabajando en una aplicación .NET donde parece haber una pérdida de memoria. Conozco las respuestas de los libros de texto, que los eventos deben ser cancelados, los objetos desechables deben ser eliminados, etc.

Tengo un arnés de prueba que puede reproducir el error. En el finalizador de una determinada clase escribo en la consola.

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

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

En el arnés de prueba, estoy creando una única instancia de Foo (que a su vez crea e interactúa con cientos de otros tipos) y luego la elimina e invoca al recolector de basura.

Estoy encontrando que el finalizador de Foo nunca se llama. Tengo una clase similar con esta configuración que se finaliza como una prueba de control.

Así que mi pregunta es esta:

¿Cómo puedo determinar usando herramientas comerciales o de código abierto exactamente qué es lo que contiene una referencia a Foo?

Tengo una licencia profesional para el generador de perfiles de memoria dotTrace, pero no puedo deducir de los archivos de ayuda cómo usarlo.

Actualizar: Ahora estoy usandodotMemory 4.0, que es el sucesor de la (buena, pero inutilizable) dotTrace Memory 3.5.

Respuestas a la pregunta(5)

Su respuesta a la pregunta