una traves todos subprocesos subproceso seguras requiere realizar que para otro metodo los llamó llamar llamadas interfaz hilos función framework formularios evaluación ejecuten diferente desde controles control como checkforillegalcrossthreadcalls aplicación aplanó acceder c# multithreading debugging concurrency stack-trace

traves - ¿Puedo obtener los rastros de pila de todos los subprocesos en mi aplicación c#?



metodo invoke c# (3)

Estoy depurando un problema aparente de concurrencia en una aplicación bastante grande que hackeo en el trabajo. El error en cuestión solo se manifiesta en ciertas máquinas de bajo rendimiento después de funcionar durante muchas (12+) horas, y nunca lo he reproducido en el depurador. Debido a esto, mis herramientas de depuración están básicamente limitadas a analizar archivos de registro.

C # hace que sea fácil obtener el seguimiento de la pila del subproceso que lanza la excepción, pero me gustaría obtener los seguimientos de la pila de todos los demás subprocesos que se ejecutan actualmente en mi dominio de aplicación en el momento en que se lanzó la excepción.

es posible?


Hay una herramienta en CodePlex llamada Managed Stack Explorer (que creo que se originó en Microsoft). Utiliza la API de depuración y creación de perfiles para capturar los seguimientos de pila de los subprocesos en una aplicación .Net en ejecución, sin la necesidad de modificar la aplicación.

Puede ejecutar su aplicación hasta que experimente el problema y luego analizarla con esta herramienta para capturar los rastros actuales de la pila de todos los subprocesos en ejecución. El beneficio de este enfoque es que deja su aplicación sin modificar (instrumentándola puede cambiar su comportamiento) y la herramienta es gratuita.



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 las herramientas de depuración para Windows instaladas 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."); }

Desplácese hasta el directorio de volcado y verá una nueva carpeta con un archivo llamado FULLDUMP_something_.dmp.

Si está en .NET4, simplemente puede arrastrarlo a VS2010 y revisar todos los subprocesos o usar subprocesos paralelos para ver qué está pasando (¡esto es increíble!)

Si está en NET3.5 o anterior, necesitará usar windbg para analizar. Usa el siguiente comando

~ * e! clrstack

para imprimir la pila de llamadas de todos los subprocesos gestionados. Si necesita más ayuda para que Windbg vuelva a publicarse o busque un tutorial en Google.