2010-09-29 9 views
5

¿Puedo configurar el depurador de Visual Studio para interrumpir la creación de subprocesos?Interrumpir la creación de subprocesos en el depurador de Visual Studio

(Tenga en cuenta que esto no es lo mismo que romper el cambio de contexto como pedido en esta otra pregunta: Can I set a breakpoint in Visual Studio (c++) to break on a thread context switch?)

+0

¿Alguna vez resolvió esto? –

+0

@Derek Tomes: No lo hice. No estoy trabajando con Windows o Visual Studio en estos días, por lo que ya no estoy buscando una solución. – pauldoo

Respuesta

2

Sí, el depurador obtiene una notificación por ello. No, la IU no le permite decirle que incumpla esa notificación. Si esto es para código administrado, entonces podría usar la muestra MDbg y modificarla.

0

Puede establecer un punto de interrupción en la primera llamada al CreateThread (quizás inserte una llamada falsa para este fin). Al presionar, cambie de Vista de código fuente a Vista desastrosa y entre en la llamada. Ir a través del ImportLib-Code y establecer un punto de interrupción. No es perfecto, pero funciona.

3

Si sabe que el subproceso está siendo creado por la clase Thread gestionada, una solución simple sería poner un punto de interrupción en su entrada (yendo a la ventana Breakpoints, haciendo clic en New-> Break at function y marcando Thread. Comienzo).

De lo contrario, como dijo Hans, tendría que usar una solución más compleja como mdbg, o usar una implementación de código abierto CLR profiler (como SAE) y poner una instrucción "asm int 3" en el ICorProfilerCallback :: Método ThreadCreated.

Además, si tiene VS2010 Ultimate, puede buscar el evento Thread Created en eventos Intellitrace y posiblemente obtener la información que necesita desde allí (aunque esto no se romperá cuando se cree el hilo, sino que le dará alguna información sobre los valores de la traza/variable de la pila en el momento en que se creó, en retrospectiva).

+1

Una pista relacionada es que ir a la ventana de herramientas de punto de interrupción (Ctrl + Alt + B), presionar Agregar punto de interrupción y escribir Foo.Foo (donde Foo es un nombre de clase, como Subproceso o Trabajador de fondo), pondría puntos de interrupción en todos los constructores de Foo. –

+0

Acabo de agregar un punto de interrupción para 'Thread.Start' tan pronto como mi aplicación comenzó, VS la atrapó. Entonces, no tenía forma de reanudar y cada vez que hacía clic en VS2010, me decía que estaba esperando un proceso. Siendo el punto, no agregue el punto de interrupción hasta que se inicie su aplicación. – teynon

5

He encontrado una manera de hacerlo. Mientras que googlear vi la pregunta opuesta: Is it possible to break on thread exit with specific error code?

pongo un punto de interrupción en la función RtlExitUserThread, después de eso me di cuenta de que todos los temas se crean con la función RtlUserThreadStart, por lo puse otro punto de interrupción a esa función y eso es todo :)

0

Hay al menos 2 cosas posibles que podría significar cuando dice que quiere romper en la creación del hilo:

  1. salto dentro del hilo creador antes que el nuevo mensaje ha sido creado
  2. Divida dentro del hilo NUEVO antes de llamar a la función proporcionada por el usuario.

Para la primera opción, querrá dividir en CreateThread, _beginthread o _beginthreadex.

Para la segunda opción, deseará dividir en RtlUserThreadStart o BaseThreadInitThunk para detectar el nuevo subproceso al principio de su ejecución antes de que se llame al código de usuario.

Desafortunadamente, Visual Studio no interrumpirá esas funciones si crea un punto de interrupción con los nombres de las funciones que he enumerado anteriormente, al menos no de forma predeterminada. El problema es que para la depuración nativa, no carga las exportaciones de DLL de manera predeterminada, y sin eso, el depurador no tiene idea de dónde encontrar los nombres que he proporcionado anteriormente.

Antes de comenzar a depurar, en Visual Studio vaya a herramientas, opciones, depuración y luego expanda el árbol de opciones de depuración en el panel izquierdo. Luego haga clic en "native" y marque "Cargar Exportaciones de DLL". Entonces puede comenzar a depurar su ejecutable nuevamente.

Después de eso, debería ser capaz de crear un punto de interrupción en cualquiera de las funciones que he mencionado escribiendo el nombre. Usted puede o no ser necesario especificar el archivo DLL de la función está en el punto de interrupción mediante la creación con el nombre de la siguiente manera:

{} ,, kernel32.dll CreateThread

o

{,, ntdll. DLL} RtlUserThreadStart

me dieron esta información iniciando aquí:

https://blogs.msdn.microsoft.com/reiley/2011/07/26/debugging-tips-for-multi-threaded-application/

y haciendo algo de expe rimente por mi cuenta. Sé que esta es una respuesta a una vieja pregunta, pero espero que esto le ahorre a otras personas el dolor que he tenido al intentar depurar los bloqueos que ocurren inmediatamente después del inicio de la secuencia.

Cuestiones relacionadas