Visual Studio, depure uno de varios subprocesos

127

Tengo una aplicación con 4 hilos que funcionan con el mismo código. Sin embargo, cuando paso salta entre los diferentes hilos. ¿Cómo puedo bloquearlo en un hilo para que los otros hilos se ignoren para la depuración?

Oskar Kjellin
fuente
¿Qué versión de Visual Studio estás usando? Express, Pro, Ultimate ..?
Mark
entonces el enlace de jeffamaphone ayudará y quizás esto también para obtener más información para cambiar a otro hilo mientras se depura msdn.microsoft.com/en-us/library/bb157786.aspx
Marque el
Véase la discusión relacionada: visualstudio.uservoice.com/forums/121579-visual-studio/...
user626528

Respuestas:

107

Si.

En la ventana Subprocesos (Depuración -> Windows -> Subprocesos) haga clic con el botón derecho en el subproceso que desee y seleccione "cambiar a subproceso".

También puede elegir "congelar" en los hilos que no desea depurar para evitar que se ejecuten. Sin embargo, no olvide "descongelarlos" si espera que trabajen.

Otras lecturas .

i_am_jorf
fuente
24
Estoy confundido. ¿Es la respuesta "No se puede hacer"? La pregunta pregunta cómo permanecer bloqueado en un hilo particular para que el depurador no salte entre ellos. Cambiar a un hilo está bien, pero tan pronto como otro hilo hace algo, el depurador salta a él. Si no puedo congelar el otro hilo porque necesita hacer cosas, ¿cómo me quedo bloqueado solo en el hilo que me preocupa?
burbujeante
Ingresos completos: | siempre debes hacer clic en cambiar a, cada vez que algo sucede
deadManN
16

Un solo paso a través de un solo hilo parece estar solucionado en su mayoría en VS 2012 (con algunas advertencias que puede ver en mi enlace a continuación). Los puntos de interrupción son un dolor.

Congelar y descongelar hilos es la solución habitual, como han dicho las respuestas anteriores, pero es tedioso y puede causar bloqueos cuando su hilo espera en otro hilo que está congelado. Puede ser difícil recuperarse sin perder su lugar en su hilo de interés.

Otro flujo de trabajo útil es aplicar un filtro de hilo en sus puntos de interrupción, también indicado en algunas de las respuestas:

Cree un punto de interrupción, haga clic con el botón derecho en el punto de interrupción, haga clic en Filtro e ingrese ThreadId = 7740 (su id. De hilo desde la ventana de hilos).

Esto puede ser muy tedioso.

Mi sugerencia a Microsoft es arreglar un solo paso (y variaciones de él) para nunca cambiar los hilos a menos que se toque un punto de interrupción explícito en otro hilo. También deberían agregar un acceso directo (tal vez Ctrl-F9) para crear un punto de interrupción con el id de hilo actual como filtro. Esto haría que el segundo flujo de trabajo sea mucho más conveniente.

Vote la sugerencia si está de acuerdo en que esto sería útil, o agregue sus propias sugerencias:

https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/8543248-make-the-debugger-stick-to-the-current-thread-inst

Steve
fuente
1
"Un solo paso a través de un solo hilo parece estar solucionado en su mayoría en VS 2012", no realmente, todavía está roto en VS2017.
user626528
10

También puede poner un punto de interrupción condicional en su código y poner thread.Id == [someValue] o Thread.Name == "[Somename]"en la condición de punto de interrupción ...

Charles Bretana
fuente
Gracias Charles, fue útil (no sabía que podías hacer eso). Sin embargo, la forma más eficiente para depurar es la que escribió jeffamaphone, ya que no sé el nombre antes de que llegue al punto de quiebre y vea algunos valores
Oskar Kjellin,
3

Existe una solución mucho más rápida para casos simples: vea los comentarios en el enlace de Steve.

el depurador solo completará un paso en el hilo del cual se originó el paso. Entonces, si llega a un punto de interrupción, desactívelo y luego comience a caminar, no debe detenerse en un hilo diferente. Si tiene otros puntos de interrupción en su aplicación y otro subproceso llega a uno, entonces depurará en el estado de subproceso mixto como se describe

Entonces, en mi caso, una vez que los diversos hilos comenzaron a llegar a mi punto de interrupción, solo presioné Continuar varias veces hasta que identifiqué la llamada que estaba buscando, luego eliminé el punto de interrupción y pasé por el resto del código mientras permanecía en el mismo hilo sin interferencia de el resto de ellos.

Obviamente, esto se convierte en un problema si tiene múltiples puntos de interrupción que desea mantener, etc., pero nuevamente, en casos simples, esto es mucho más fácil de hacer.

Boris
fuente
2

Esto se parece mucho a un problema muy similar en Visual Studio 2008 SP1. Se solucionó con una revisión posterior al SP. Pero hay otra evidencia de que la revisión no se incorporó a la base del código, este elemento de comentarios también fue un problema. No es inusual que las revisiones no se vuelvan a integrar.

No hay un elemento de comentarios que describa exactamente su problema, al menos que pueda encontrar. Te recomiendo que archives uno. Dado el problema habitual con errores de reproducción como este, le recomiendo encarecidamente que incluya un proyecto de reproducción que muestre este problema con instrucciones sobre cómo reproducir el problema.

Hay una especie de solución alternativa para su problema, puede ir a Debug + Windows + Threads, hacer clic con el botón derecho en los hilos que no desea depurar y seleccionar Congelar. No olvides descongelarlos más tarde.

Estos errores se corrigieron nuevamente en Visual Studio 2010 Service Pack 1.

Hans Passant
fuente
1

Estoy usando Visual Studio Professional 2017, y uso la ventana Subprocesos para congelar y descongelar selectivamente los subprocesos. Por lo general, tengo varios subprocesos del mismo código y solo quiero congelarlos, no otros. De hecho, me gusta la ventana de MS Threads porque puedo seleccionar un subconjunto de hilos para congelar. Agrupo los hilos por nombre y luego puedo congelar todos los que ejecutan el mismo código que estoy depurando mientras dejo que se ejecuten los hilos restantes. Intenté usar la extensión Erwin Mayer, y funcionó muy bien, pero congeló todos los hilos excepto el que estoy ejecutando, y a veces me encuentro en una situación en la que la depuración no alcanza el punto de interrupción, creo que debería, entonces porque todos otros hilos se detienen y la aplicación parece detenida. Al presionar el botón de pausa, y al descongelar hilos en la ventana de hilos se soluciona ese problema.

BlueMax
fuente
0

5. Paso a través de un solo hilo sin saltar

¿Con qué frecuencia está depurando código multiproceso, cuando alcanza su primer punto de interrupción, da un paso y luego, de repente, se detiene con la flecha amarilla en otro hilo? El comportamiento inesperado proviene del punto de interrupción que aún se está configurando y, en consecuencia, se golpea. De forma predeterminada, el depurador se detendrá en un punto de interrupción cada vez que sea alcanzado. Esto significa que cuando das un paso, todos los subprocesos pueden ejecutarse, y uno de tus subprocesos en ejecución alcanza este punto de interrupción antes de que el paso se complete en tu subproceso actual. La próxima vez que se encuentre en esta situación intente esto:

  1. Deshabilite o elimine el punto de interrupción que ha sido alcanzado por el nuevo hilo al que cambió el depurador.
  2. Presione Continuar (F5)
  3. Observe cómo se completa su primer paso inicial en ese primer subproceso y ahora es el contexto de depuración activo.
  4. Dado que sus puntos de interrupción se eliminan o deshabilitan, puede continuar pisando ese hilo único sin interrupción.

7 trucos menos conocidos para la depuración en Visual Studio

rebornx
fuente