¿Cuál es la mejor manera de adjuntar un depurador a un proceso en VC++, justo en el mismo punto en el tiempo?

StackOverflow https://stackoverflow.com/questions/663449

Pregunta

Cuando la depuración, a veces es necesario adjuntar una ya se ejecuta el proceso en lugar de sólo a partir de la aplicación en un depurador.

Es común para mí para poner en un Sleep() o cuadro de mensaje de llamada, de modo que es más fácil para adjuntar un depurador.Me preocupa que algunos de estos pueden ser cometidos finalmente al control de código fuente.

¿Cuál es la mejor cosa a hacer para evitar esta situación, mientras que todavía retrasar el tiempo suficiente para que pueda conectar el depurador a un proceso en ejecución?

Vigilando el Sueño o el cuadro de mensaje con un #ifdef _DEBUG es una manera, pero me pregunto si hay una manera mejor.

Con un Sueño que usted también tiene el problema de que no puede adjuntar en el tiempo.Con un cuadro de mensaje que tiene el problema de que puede ser la depuración remota, o la depuración de un proceso que no tiene visible la interfaz de usuario (ejemplo ejecuta como un servicio en windows Vista)

Otros consejos

Para adjuntar un depurador en un punto en particular, tiene varias opciones:

Lo más simple es llamar a DebugBreak, que es más o menos equivalente a __asm int 3, pero también funciona en otras arquitecturas (MSVC para x64 no permite el ensamblaje en línea, si recuerdo correctamente). Aparecerá la ventana del depurador justo a tiempo y podrá seleccionar entre los depuradores registrados (es decir, Visual Studio) para adjuntarlos al proceso.

Alternativamente, puede introducir una llamada a Sleep, dándole la oportunidad de adjuntar el depurador. Debe usar #ifdef _DEBUG alrededor de esto, para asegurarse de que realmente no se envía con este código incluido.

Una pregunta: ¿por qué no puede ejecutar el código desde el IDE? ¿Es un servicio o una DLL cargada por IIS o similar?

En este caso, puede consultar la ImageFileExecutionOptions clave de registro, que le permite adjuntar un depurador en el momento en que se inicia el proceso.

Si usa cdb para esto, puede configurarlo como servidor o cliente para una instancia de WinDbg, y depurar de esa manera. He hecho esto en el pasado usando WinDbg como un depurador del kernel y usando ImageFileExecutionOptions para comenzar ntsd -d con el proceso con nombre. Esto hace que WinDbg entre en modo de usuario. Esta es a veces una técnica útil.

otra variante, que a veces uso es

while( !::IsDebuggerPresent() )
    ::Sleep( 100 ); // to avoid 100% CPU load

debería esperar silenciosamente hasta que adjunte su depurador al proceso.

Freddy y Reoa tienen las soluciones correctas. Pero quería agregar una razón por la cual no usar un cuadro de mensaje.

Mostrar un cuadro de mensaje solo detiene parcialmente su aplicación. Debido a que está mostrando la interfaz de usuario, todavía se está ejecutando una bomba de mensajes en al menos un hilo en su programa. Entonces, si su código hace algo de lo siguiente.

  1. Se comunica a través de mensajes de Windows
  2. Tiene una interfaz de usuario no trivial
  3. es multihilo

Básicamente, solicitará un depurador en un estado, pero se adjuntará a su programa en un estado completamente diferente. Esto puede conducir a situaciones desconcertantes y errores.

Recientemente realizamos un cambio en nuestra base de código para nunca mostrar un MessageBox a fin de facilitar el descanso por esta misma razón. Produce muy mal comportamiento para una aplicación no trivial.

Tener que adjuntar en 'el momento' es un dolor ...una opción es pero explícita DebugBreak() instrucciones en el código para forzar el tema, y cuidando de ellos con #ifdef _DEBUG sería una buena idea.Utilizamos una ASERCIÓN macro que puede llamar DebugBreak(), por lo que sólo puede escribir ASSERT(falso)

Otra opción a considerar es el uso de la imagen de archivo de las opciones de ejecución " para iniciar el depurador de forma automática.Ver este blog y el MSDN de la documentación.

Buscar:

DebugBreak , __debugbreak y amigos

o

static void timeToChase() { __asm { int 3;};}

__asm int 3 

Este punto de interrupción difícil abrirá el cuadro de diálogo de depuración, que le permitirá adjuntar al proceso. Envuelva eso en #ifdef _DEBUG y solo lo golpeará en las versiones de depuración.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top