Tengo una solución con algunos proyectos. Hay varios puntos de quiebre en diferentes proyectos. Quiero rastrear el primer hilo alcanzado uno de estos puntos de quiebre y continuar rastreando ese hilo único a pesar de que otros hilos entren en los mismos bloques de código.
Sé que esto es posible mediante la definición de una condición en el punto de interrupción, es decir, nombre de subproceso = ... o Id de subproceso = ... pero mi caso es una aplicación ASP.NET cargada y tan pronto como me conecto a w3wp.exe
muchos los hilos alcanzarán los puntos de quiebre. Necesito algo como a ThreadLocal<break-point>
.
¿Es posible? ¿Si es así, cómo?
Respuestas:
Congelar / descongelar hilos es una forma incorrecta porque otros hilos no ejecutan ningún código.
La forma más correcta y útil es:
En Visual Studio 2015 y versiones posteriores, el proceso es similar:
Por lo tanto, todos los subprocesos se ejecutan, pero el depurador solo llega al subproceso actual.
fuente
System.Threading.Thread.CurrentThread.ManagedThreadId
o algo así?Esto es lo que hice:
Establezca un punto de interrupción condicional que sabía que solo golpearía el hilo que estaba buscando.
Una vez que llegue el punto de interrupción y esté en el hilo que desea, en la ventana de hilos de Visual Studio (durante la depuración, Depuración -> Windows -> Hilos), Ctrl+ A(para seleccionar todos los hilos) y luego Ctrlhaga clic en el hilo en el que se encuentra actualmente . Debería tener todos los hilos excepto el que desea depurar seleccionado.
Ahora, Visual Studio solo atravesará el hilo descongelado. Parece que es mucho más lento al hacer esto, presumiblemente porque tiene que recorrer todos los hilos congelados, pero aportó algo de cordura a mi depuración de subprocesos múltiples.
fuente
Acabo de lanzar una extensión de Visual Studio 2010+ que hace exactamente lo que estás buscando. Y es gratis :).
Compruébelo aquí en la Galería , en la página oficial o en el repositorio de Github .
fuente
Si se generan múltiples hilos como para una aplicación web, las respuestas de @MattFaus no funcionarán. lo que hice en su lugar es lo siguiente
fuente
Un enfoque ligeramente diferente que he usado:
Esto supone que tiene tiempo para hacer lo anterior antes de que un segundo hilo llegue a su punto de interrupción. Si no, y otros hilos llegan a su punto de interrupción antes de que haya hecho lo anterior, puede hacer clic derecho en ellos en la ventana de hilos y elegir congelar.
fuente
lock(m_someObject) { ; }
En VS 2019:
fuente
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 (agruparla) y luego depurar solo esa instancia. No agregaría un punto de interrupción en el código que los usuarios están activando. Si esa no es una opción, agregaría más rastreo.
Sin embargo, si esto es absolutamente necesario y necesita una estadística de solución, estoy seguro de que podría agregar un punto de interrupción que se rompa solo si la solicitud proviene de su dirección IP. Lo haría agregando un punto de interrupción condicional que inspeccione
HttpContext.Request.UserHostAddress
. Sin embargo, tenga en cuenta que esto ralentiza su aplicación considerablemente.fuente
Si no desea detener todos los demás subprocesos (tal vez está adjuntando el depurador de Visual Studio 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 " Desbordamiento de pila " al depurar programas multiproceso en Visual Studio .
Sin embargo, el enlace solo explica cómo depurar línea por línea. Le sugiero que modifique la macro (si se siente cómodo con ella) para que modifique todos los puntos de interrupción (en un rango de línea dado, por ejemplo) para que se detenga solo en el hilo actual.
fuente
Creo que esto es ligeramente diferente en Visual Studio 2015. Han cambiado algunas cosas en los puntos de interrupción, pero así es 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 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 el cuadro Condiciones y haga lo anterior.
fuente
Establezca una Condición de punto de interrupción haciendo clic derecho en la barra lateral de la línea. Seleccione "Condición" e ingrese lo siguiente con el nombre de su hilo entre comillas:
System.Threading.Thread.CurrentThread.Name == "name_of_your_thread"
Alternativamente, puede hacer lo mismo obteniendo el "ID administrado" del hilo de la ventana "Hilos" y usar:
System.Threading.Thread.CurrentThread.ManagedThreadId == your_managed_thread_id
fuente