2010-02-23 19 views
5

Estoy desarrollando una aplicación multiproceso de WinForm con C#. A veces sucede que mi aplicación se cuelga, o se congela o bloquea.Saber En qué punto se congela la aplicación

Cuando esto sucede y estoy corriendo en el modo DEPURAR, ¿hay alguna forma de entender en qué línea de código está mi aplicación actualmente? Como está congelado, espero encontrar un punto donde la aplicación esté bloqueada o bloqueada o lo que sea. ¿Es posible hacerlo de alguna manera?

Cuando está congelado intenté abrir la ventana CALL STACK, pero esto no muestra ninguna información; ¿Hay alguna acción que pueda hacer? Algunos "pause and check" o lo que sea?

Respuesta

5

Es posible que deba abrir la ventana de Subprocesos y cambiar el subproceso actual. Mientras realiza la depuración, elija Depurar-> Romper todo y abra la ventana de Subprocesos. Si revisas cada tema, al hacer doble clic en él, deberías poder investigar la pila de llamadas para cada tema.

Dicho esto, si puede ejecutar su programa en VS 2010, esto se vuelve mucho más fácil. En VS 2010, puede usar el nuevo Simulador de simultaneidad y ejecutar su código en el Simulador de simultaneidad con la opción de Visualizar el comportamiento de una aplicación multiproceso. Una vez que la aplicación se bloquea, ciérrelo y deje que el generador de perfiles se mueva:

Finalmente, obtendrá un diagrama que muestra cada hilo en su programa y cuando están bloqueados. Se mostrará la lista de llamadas para cada subproceso bloqueado, así como también el bloqueo que se está reteniendo (con la línea de código fuente). Esto hace que sea muy fácil rastrear un bloqueo muerto.

+0

¡Hola Reed! ¡Muchas gracias por su excelente respuesta! Una cosa más pequeña si todavía estás cerca ... No tengo VS 2010 y sigo usando VS 2008. ¿Sabes si hay alguna buena herramienta gratuita que produzca más o menos lo mismo que acabas de describir para los diagramas de hilos? Gracias por tu ayuda. –

+0

No, no sé nada gratis que esté cerca. El juego de herramientas de enhebrar de Intel funciona (pero es muy caro). Puede descargar VS 2010 RC Ultimate gratis ahora mismo y ejecutarlo en sus proyectos, aunque ... –

+0

¡Hola, Reed! ¡Muchas gracias por su ayuda! ¡Que tengas un buen día! –

2

Cuando se conecta el depurador, vaya al menú Depurar y elija 'Romper todo' ... Luego puede examinar las pilas de llamadas para todos los hilos.

+0

¡Genial! ¡Gracias hombre! –

2

Puede presionar pausa y ver dónde termina (use la ventana de la pila de llamadas antes mencionada). Lo más probable es que termine en código nativo. Podría tratar de salir un poco o simplemente mirar la pila para una función administrada para depurar.

Alternativamente, podría poner un punto de interrupción después de que la aplicación se "congele" e intentar localizar un bucle que no termine.

Los dos puntos anteriores están asumiendo que su aplicación está ocupada (uso de 100% de la CPU). Sin embargo, si su aplicación está atrapada en un bloqueo muerto o simplemente está esperando un mutex que no funciona, tendrá que volver a leer su código manualmente e intentar resolverlo por su cuenta.

+0

Auch! De Verdad? Leer manualmente el código es la única manera de averiguar dónde tengo un punto muerto? Hace un tiempo leí sobre una poderosa herramienta llamada WinDbg. ¿Alguna vez ha usado y sabe si esa tabla puede ayudarme a detectar en qué parte del código está metida la aplicación? –

+0

Bueno, si está en un punto muerto, su hilo está atrapado en una función en algún lugar profundo de la rtl dll hasta que se determine que el planificador cumple con la condición. Una pila de llamadas no le dirá qué condición espera. – Blindy

Cuestiones relacionadas