2011-11-18 19 views
25

Me gustaría poder seguir solo la ejecución de un hilo durante la depuración. Uso un threadpool para que el depurador siga cambiando entre hilos y esto hace que la depuración sea muy incómoda.Cómo depurar solo un hilo en Visual Studio

de lectura:

consigo uno solución que es puntos de interrupción condicionales (basado en el nombre de la rosca). Sin embargo, no puedo decir "el hilo # 3" siempre será el que trate el caso interesante, así que tendría que cambiar la condición para cada ejecución. Demasiado trabajo.

Otra solución es utilizar la característica de congelación/descongelación para hacer que solo se ejecute mi hilo interesante. Sin embargo, esto hace que cierta información no esté disponible porque todos los hilos están en pausa.

Lo que estoy usando ahora es poner en ejecución el programa hasta que llegue a un punto de ruptura en el que estoy seguro de estar en el buen hilo. Luego pause todos los otros hilos de threadpool y trato de reanudar la ejecución. Si los programas parecen estar atascados, hago una pausa y descongelo el hilo actual.

La solución ideal sería encontrar el hilo correcto, marcarlo y luego decir a Visual Studio: "romper solo si el hilo actual está marcado".

¿Esto es posible?

+0

Entonces, ¿cuál es el criterio para romper el hilo? – abatishchev

+0

el criterio sería stop es el hilo marcado – kamaradclimber

+0

Pruebe su código de forma aislada. Con pruebas unitarias, por ejemplo. Entonces solo tiene que depurar la interacción de subprocesos, el tipo de depuración en la que * no * desea congelar subprocesos. –

Respuesta

2

Usaría los puntos de corte condicionales que mencionó, pero en lugar de compararlos con una cadena fija, compárelos con alguna variable semi-global (¿quizás una propiedad estática en su clase principal?).

Cuando identifica qué hilo se vuelve interesante, puede usar la ventana inmediata para establecer el nombre de la variable y permitir que se toquen los puntos de corte condicional.

+0

que sería una posible solución. Sin embargo, veo dos inconvenientes: necesito modificar mi código para depurarlo y tengo que pasar por un procedimiento de punto de corte (complicado) (1 clic vs clic, copiar-pasar, 1 clic) – kamaradclimber

+0

Para aquellos que sintonizan últimamente (como yo) I sugiera que lea esto [respuesta que elabora esta solución alternativa] (http://stackoverflow.com/a/38926833/1348138) un poco más. También recomiendo votar [la sugerencia mencionada aquí] (http://stackoverflow.com/a/31191208/1348138). – robert4

6

Mientras que la depuración se puede congelar todos los hilos en la ventana de Temas y reanudar sólo el que le interesa.

+3

gracias, pero no responde la pregunta: quiero que la aplicación se ejecute normalmente y solo detenerse en puntos de ruptura en un hilo – kamaradclimber

1

Un poco tarde pero esto surgido como la primera respuesta en una búsqueda.

utilizo el siguiente en VS 2015 ...

var thread = System.Threading.Thread.CurrentThread; 
if (thread.Name == null) 
      thread.Name = "Main"; 

Luego, en el punto de ruptura ...

System.Threading.Thread.CurrentThread.Name == "Main" 

para que sea más flexible, puede incrustar hilo en una clase personalizada.

FYI: No puede usar variables estáticas en un punto de interrupción condicional ya que no están en contexto. Nunca entendí realmente por qué la estática no siempre está en contexto.

+0

gracias por su respuesta (incluso tarde) ¿dónde agregaría el primer código para nombrar el hilo? (He mencionado que agregar esto al código requeriría saber de antemano el hilo que quiero seguir) – kamaradclimber

+0

@kamaradclimber. Tan pronto como sea posible. Solo puede establecer el nombre de un hilo una vez o hay una excepción. Puede establecer thread.Name manualmente en la depuración. También puede decir si thread.name == xxx System.Diagnostics.Debugger.Break() – Paulustrious

+0

Lo sentimos ... 5 minutos de tiempo de espera. @kamaradclimber. Tan pronto como sea posible. Solo puede establecer el nombre de un hilo una vez o hay una excepción. Puede establecer thread.Name manualmente en debug o simplemente System.Threading.Thread.CurrentThread.Name = "xyz". También puede decir ... if (thread.name == xxx) {System.Diagnostics.Debugger.Break();}. Puede darle múltiples hilos con el mismo nombre si lo desea. En el pasado, he agregado código a lo largo de las líneas de bool stop = thread.Name == "someName" y luego en el punto de interrupción de depuración puedes simplemente poner la condición 'stop'. Hace la vida más fácil – Paulustrious

Cuestiones relacionadas