Sugiero tomar un volcado del proceso cuando se produce la excepción. En el mismo lugar donde está registrando la excepción, llame al método MakeDumpFile() como se muestra a continuación.
Esto supone que tiene Debugging Tools For Windows instalado en la máquina problemática.
private static void MakeDumpFile()
{
int pid = Process.GetCurrentProcess().Id;
Console.WriteLine("Creating dump for pid " + pid);
//path to adplus executable; ensure you have Debugging tools installed;
string program = @"C:\Program Files (x86)\Debugging Tools for Windows (x86)\adplus.exe";
//args for adplus; ensure the crashdump folder exists!
string args = string.Format(@"-hang -p {0} -o c:\crashdump", pid);
var startInfo = new ProcessStartInfo(program, args);
startInfo.UseShellExecute = false;
startInfo.ErrorDialog = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
var process = Process.Start(startInfo);
Console.WriteLine("The following is output from adplus");
Console.WriteLine(process.StandardOutput.ReadToEnd());
Console.WriteLine("Finished creating dump.");
}
Navegue hasta el directorio de volcado y debería ver una nueva carpeta con un archivo en él nombró FULLDUMP_something_.dmp.
Si usted está en .NET4 puede simplemente arrastrar esto en VS2010 y echa un vistazo a todos los hilos o utilizar hilos paralelos para ver lo que está pasando (esto es impresionante!)
Si en NET3.5 o antes necesitarás usar windbg para analizar. Utilice el siguiente comando
~ * e! Clrstack
para imprimir la pila de llamadas de todos los subprocesos administrados. Si necesita más ayuda, windbg going post back o google para obtener un tutorial.
Estaba buscando algo así el otro día (y me encontré con esta pregunta: http://stackoverflow.com/questions/190236/how-do-i-make-a-thread-dump-in- net-a-la-jvm-thread-dumps). Parece que no tiene suerte, pero sigue siendo bueno ver lo que los que respondieron a esa pregunta tenían que decir. –
Gracias Dan, saqué algunas cosas bastante útiles de tu pregunta vinculada ... –