¿Cómo puedo depurar un error interno en el .NET Runtime?

Estoy tratando de depurar algunos trabajos que procesan archivos grandes. El codigo en sitrabajos, pero hay errores esporádicos reportados desde el propio .NET Runtime. Para el contexto, el procesamiento aquí es un archivo de 1.5GB (cargado en la memoria solo una vez) que se está procesando y liberando en un bucle, deliberadamente para intentar reproducir este error impredecible de otra manera.

Mi fragmento de prueba es básicamente:

try {
    byte[] data =File.ReadAllBytes(path);
    for(int i = 0 ; i < 500 ; i++)
    {
        ProcessTheData(data); // deserialize and validate

        // force collection, for tidiness
        GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
        GC.WaitForPendingFinalizers();
    }
} catch(Exception ex) {
    Console.WriteLine(ex.Message);
    // some more logging; StackTrace, recursive InnerException, etc
}

(Con un poco de tiempo y otras cosas lanzadas)

El bucle se procesará bien para un número no determinista de iteracionescompletamente exitoso - No hay problema alguno; entonces el proceso terminará abruptamente. El manejador de excepciones no es golpeado. La prueba implica mucho uso de memoria, pero se vio muy bien durante cada iteración (no hay una pérdida de memoria obvia, y tengo mucho espacio libre: 14 GB de memoria primaria no utilizada en elpeor punto en el diente de sierra). El proceso es de 64 bits.

El registro de errores de Windows contiene 3 nuevas entradas, las cuales (a través del código de salida 80131506) sugieren un error del motor de ejecución: una pequeña criatura desagradable. UNArespuesta relacionada, sugiere un error de GC, con un "arreglo" para deshabilitar GC concurrente; Sin embargo, este "arreglo" no evita el problema.

Aclaración: este error de bajo nivel no llega alCurrentDomain.UnhandledException evento.

Aclaración: laGC.Collect está ahí solo para monitorear la memoria de dientes de sierra, para verificar si hay pérdidas de memoria y para mantener las cosas predecibles; eliminarlo no hace que el problema desaparezca: solo hace que guarde más memoria entre iteraciones y hace que los archivos dmp sean más grandes; p

Al agregar más trazas de consola, he observado fallas durante cada una de las siguientes:

durante la deserialización (muchas asignaciones, etc.)durante GC (entre un "enfoque" de GC y un GC "completo", utilizando la API de notificación de GC)durante la validaciónforeach sobre algunos de los datos) - curiosamentejusto después de Un GC "completo" durante la validación.

Así que hay muchos escenarios diferentes.

Puedo obtener archivos crash-dump (dmp); ¿Cómo puedo investigar esto más a fondo, para ver qué está haciendo el sistema cuando falla tan espectacularmente?

Respuestas a la pregunta(5)

Su respuesta a la pregunta