2011-07-25 21 views
5

tengo problemas con la depuración paso a paso de una aplicación .NET multiproceso en Visual Studio 2008.Sugerencias para depurar una aplicación de multiproceso

Con cada intensificaron línea, Visual Studio se vuelve más lento y más lento (tarda más y más tiempo para pasar a la siguiente línea) y generalmente se cuelga después de varias líneas (obtengo el mensaje "Visual Studio está ocupado"), y necesito detener la depuración.

Sospecho que el problema se debe a que la aplicación tiene varios clientes TCP/IP conectados, lo que significa que cada vez que hago un punto de interrupción, su búfer de red se llena hasta que continúe mi aplicación. Cada vez que uso F10 para pasar a la siguiente línea de código, Visual Studio pronto despierta todos los otros hilos para que manejen los datos de entrada.

¿Alguien tiene experiencia con tales problemas y sugerencias sobre cómo evitarlos?

+1

¿Pueden ser buenos registros sería una mejor? O intente depurar con condiciones ... – acoolaum

+1

Utilizo el registro (log4net), y generalmente uso pruebas unitarias para probar la aplicación. Pero de vez en cuando tengo que hacer un punto de quiebre en alguna parte. El punto de inflexión * puede * ser condicional (si eso es lo que quería decir), pero eso no cambia el hecho de que apenas puedo ejecutar las siguientes dos líneas sin que VS se cuelgue. Hasta ahora, perdería la paciencia y agregaría un montón de depuraciones al registro durante todo el método, y luego trabajaría desde allí. Pero no tiene sentido no poder usar un depurador correctamente. – Groo

Respuesta

7

Esto no es una tarea fácil en absoluto, creo que usted entiende esto. Es muy importante tener una comprensión clara de los mecanismos de sincronización y enhebrado proporcionados por .NET Framework. Solo después de hacer esto puede iniciar diseñando una sincronización y gestión de subprocesos.

Sugeriría definir nombres claros para sus hilos e introducir un registro extenso, log4net sería una buena opción, ya que le proporciona instrumentos de registro seguros y robustos.

consejos de Visual Studio:

Ver más aquí: Debugging Multithreaded Applications

EDIT: Añadido más consejos

tratar de identificar el que los estados lógicos de aplicaciones muy útiles para depurarse de forma manual y el uso de los puntos de interrupción condicionales si es posible para que pueda evitar roturas adicionales de depurador:

2

Como se señaló en el recuadro, es mejor utilizar los registros cronometrados para ver las excepciones o los informes de fallos. Además, puede agregar compilación condicional para usar rutas alternativas que no causen ninguna interrupción. Por ejemplo, al depurar funciones que dependen de obtener información de TCP/IP, use una función simulada que simplemente devuelve la cadena sin realizar ninguna comunicación TCP/IP.

Hay bibliotecas creadas solo para hacer este tipo de burla. Es posible que desee ver uno de esos.

1

Esta sugerencia puede ser una posibilidad remota, pero aquí voy: ¿hay alguna posibilidad de que la aplicación que intentas depurar sea una aplicación de WinForms y tengas abierta una ventana de observación?

En el pasado, antes de dejar de usar Watch Windows casi por completo, recuerdo haber experimentado el escenario más lento o más lento.Podría repetirlo si mi punto crítico se tocó en el contexto de un hilo no relacionado con la interfaz de usuario, y el sondeo de valores de la ventana de observación incluía valores vinculados a la interfaz de usuario, el depurador se tragaría silenciosamente excepciones entre hilos, y sería cada vez más lento y más lento y más lento hasta que fue inutilizable.

El cierre de las ventanas del reloj eliminó por completo el retraso.

Cuestiones relacionadas