¿Cómo depurar un solo subproceso en Visual Studio?


Tengo una solución con algunos proyectos. Hay varios puntos de quiebre en diferentes proyectos. Quiero rastrear el primer subproceso que golpeó uno de estos puntos de interrupción y continuar rastreando ese subproceso único a pesar de que otros subprocesos ingresen los mismos bloques de código.

Sé que esto es posible a través de la definición de una condición en el punto de interrupción, es decir, nombre del hilo = ... o id de hilo=... pero mi caso es un pesado cargado ASP.NET aplicación y tan pronto como se adjunta a w3wp.exe muchos hilos llegará a los puntos de quiebre. Necesito algo como un ThreadLocal<break-point>.

Es posible? Si es así, ¿cómo?

Author: Peter Mortensen, 2011-03-15

8 answers

Freeze/Thaw threads es una forma incorrecta porque otros subprocesos no ejecutan ningún código.

La forma más correcta y utilizable es:

  1. Pulse Ctrl+A en la ventana puntos de interrupción (seleccione todos los puntos de interrupción).
  2. Haga clic derecho y seleccione "Filtrar...".
  3. Introduzca "ThreadId=(id de hilo actual)".

En Visual Studio 2015 y posteriores, el proceso es similar:

  1. Pulse Ctrl+A en la ventana puntos de interrupción (seleccione todos los puntos de interrupción).
  2. Correcto haga clic y seleccione "Configuración"...".
  3. Marque " Condiciones "y seleccione" Filtro " en el menú desplegable
  4. Introduzca "ThreadId=(id de hilo actual)".

Así que todos los subprocesos se ejecutan, pero el depurador solo se ejecuta en el subproceso actual.

 128
Author: hzdbyte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-31 05:48:26

Esto es lo que hice:

  1. Establecer un punto de interrupción condicional que I sabía que sólo golpearía en el hilo que estaba buscando.

  2. Una vez que el punto de interrupción llega y está en el subproceso que desea, en la ventana Subprocesos de Visual Studio (mientras debug, Debug -> Windows -> Threads), Ctrl + A (para seleccionar todos los hilos), y luego Ctrl + haga clic en el hilo en el que se encuentra actualmente. Debe tener todos los subprocesos excepto el que desea depurar elegido.

  3. Haga clic con el botón derecho y elija "Congelar".

Ahora, Visual Studio solo pasará por el hilo descongelado. Parece ser mucho más lento al hacer esto, presumiblemente porque tiene que recorrer todos los hilos congelados, pero trajo algo de cordura a mi depuración multihilo.

 296
Author: Matt Faus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 18:14:36

Acabo de lanzar una extensión de Visual Studio 2010+ que hace exactamente lo que está buscando. Y es gratis :).

Presentación

Esta extensión de Visual Studio agrega dos accesos directos y botones de la barra de herramientas para permitir que los desarrolladores se centren fácilmente en subprocesos individuales mientras depuran aplicaciones multiproceso.

Reduce drásticamente la necesidad de ir manualmente a la ventana de Subprocesos para congelar / descongelar todos los subprocesos, excepto el que debe seguirse, y por lo tanto ayuda a mejorar la productividad.

Características

Restringe la ejecución solo al subproceso actual. Congelará todos los otros hilos. Acceso directo: CTRL + T + T o botón de copo de nieve. Cambie al siguiente hilo único (basado en ID). Cambiará el hilo actual y congelará todos los demás hilos. Acceso directo: CTRL + T + J o Siguiente botón.

Échale un vistazo aquí en la Galería , en la página oficial o en el Github repository .

 13
Author: Erwin Mayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-27 08:39:44

Un ligeramente enfoque diferente que he utilizado:

  1. Cree un punto de interrupción normal y deje que se golpee
  2. Busque en la ventana de subprocesos el ID de subproceso administrado que está depurando actualmente
  3. Haga clic derecho en su punto de interrupción en la ventana puntos de interrupción y seleccione el filtro
  4. Ingrese ThreadId = xxx donde xxx es el ID de hilo de 2
  5. Ahora puede depurar sin detener otros subprocesos y sin que lleguen a su punto de interrupción

Esto supone tienes tiempo para hacer lo anterior antes de que un segundo hilo llegue a tu punto de interrupción. Si no y otros hilos golpean su punto de interrupción antes de que haya hecho lo anterior, puede hacer clic derecho en ellos en la ventana hilos y elegir congelar.

 8
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-30 08:04:01

Si se generan varios hilos como para una aplicación web, las respuestas de @MattFaus no funcionarán. lo que hice en su lugar es lo siguiente

  • Configure un punto de interrupción para interrumpir el hilo en la función que quiero.
  • Una vez que el hilo llega al punto de interrupción y está en pausa, elimino el punto de interrupción y continúo la depuración usando F8,F10 y F11, para que los otros hilos puedan ejecutarse.
 8
Author: Mikaël Mayer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-17 23:05:35

Sugeriría agregar otra instancia de la aplicación en el servidor en vivo, ya sea en el mismo hardware o en una nueva máquina (cluster it) y luego depurar solo esa instancia. Yo no añadiría un punto de interrupción en el código que los usuarios están activando. Si eso no es una opción, añadiría más rastreo.

Sin embargo, si esto es absolutamente necesario y necesita una solución stat, estoy seguro de que podría agregar un punto de interrupción que se interrumpe solo si la solicitud proviene de su dirección IP. Usted haría esto mediante la adición de un punto de interrupción condicional que inspecciona HttpContext.Request.UserHostAddress. Sin embargo, tenga en cuenta que esto ralentiza su aplicación considerablemente.

 1
Author: steinar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-25 18:13:19

Si no desea detener todos los demás subprocesos (tal vez esté adjuntando Visual Studio debugger a una aplicación en ejecución que necesita responder a las solicitudes), puede usar una macro que cree y elimine puntos de interrupción automáticamente.

Esto se sugiere en una respuesta a la pregunta de desbordamiento de pila "Paso a paso" al depurar programas multiproceso en Visual Studio.

Sin embargo, el enlace solo explica cómo depurar línea por línea. Te sugiero que modifiques la macro (si eres cómodo con él) para hacer que modifique todos los puntos de interrupción (en un rango de línea dado, por ejemplo) para detener solo en el hilo actual.

 1
Author: kamaradclimber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:08

Creo que esto es ligeramente diferente en Visual Studio 2015. Han cambiado algunas cosas en los puntos de interrupción, pero he aquí cómo aplicar la respuesta aceptada de hzdbyte (arriba):

En el punto de interrupción en el margen de codificación, Haga clic con el botón derecho > Condiciones > Cambiar de 'Expresión condicional' a 'Filtro'. Esto entonces le permite filtrar por ThreadId.

Alternativamente en el punto de interrupción en la ventana Puntos de interrupción, haga clic con el botón derecho > Configuración > marque la casilla Condiciones y haga lo anterior.

 0
Author: Patelos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-04 14:35:47