2012-06-29 21 views
10

He estado usando gdb normalmente para 1 o 2 proyectos. Es decir. Invoco gdb --args prog args. gdb se ejecuta en el mismo tty que el programa que estoy depurando.espere a que se conecte gdb

Sin embargo, mi último proyecto está modificando la utilidad dtach. Este es un programa como la pantalla, por lo que los tty se redirigen a otro lugar, por lo tanto, tengo que usar la funcionalidad de adjuntar de gdb.

El problema con gdb attach es que, obviamente, no se puede conectar desde el principio, ya que es necesario ejecutar el programa primero para obtener un pid para adjuntarlo.

¿Hay alguna forma en que pueda hacer que un programa espere en un punto hasta que se adjunte gdb?

No puedo usar gdbserver porque estoy en cygwin. También traté de usar pause(), pero eso se colgó cuando traté de continuar.

+0

Mi mal, el mensaje en la lista de correo quejándose de que gdbserver no funciona en cygwin fue desde hace 9 años. Compilado anoche y funciona bien. Por alguna razón, el binario gdbserver no está incluido en el repositorio cygwin, probablemente debido a los casos de uso restringido para él en cygwin. También hay una forma potencial de conectar gdb en el programa desde el principio utilizando el resguardo de gdb. Gracias por las respuestas de todos modos. – rhlee

Respuesta

1

Algunas plataformas pueden tener instrucciones o trampas de espera para el depurador.

Más transportablemente, podría hacer que el programa espere alguna condición externamente satisfactoria, como una conexión a un socket o escribir algunos datos en un fifo. Luego puede hacer la conexión o enviar datos ficticios desde un tercer terminal.

O podría poner un bucle infinito en el programa, probando el valor de alguna variable volátil que modificaría con el depurador para permitir que continúe.

Si mal no recuerdo, puede usar Windows Apis en programas cygwin, y algunas búsquedas web parecen indicar una para detectar si el programa se está depurando, por lo que es posible que pueda repetir hasta que regrese.

12

Así es como resuelvo este problema. He visto a otras personas hacer este truco también.

Elija el lugar donde desea que su programa se detenga y espere a que adjunte el depurador. Para la mayoría de los programas, esto será el comienzo, pero si hay algún trabajo de iniciación que deba hacer, es posible que desee terminarlo y luego hacer esto.

poner en un bucle similar a esto:

#ifdef DEBUG 

int i = 0; 

while (i == 0) 
{ 
    usleep(100000); // sleep for 0.1 seconds 
} 

#endif // DEBUG 

Una vez que haya conectado con éxito al proceso, puede utilizar el depurador para cambiar el valor de la variable i, que romperá el bucle y permitir la normalidad ejecución para continuar.

El comando gdb para cambiar la variable a 1: set var i = 1

Otra cosa que hago todo el tiempo: defino un corto función llamada nop() que no hace nada ("ninguna operación"). Luego hago una llamada al nop() en cualquier lugar que quiera romper, y pongo un punto de interrupción dentro de nop().

Nota: si compila sus compilaciones de depuración con -O0, el compilador no optimizará la variable. Si necesitabas este truco para trabajar con una compilación optimizada, supongo que necesitarías declarar la variable como volatile.

+0

Tiene que haber una solución donde instale un manejador de señal que establecerá la variable 'i' para romper el ciclo? – To1ne

9

Al menos con LLDB haciendo que el proceso envíe SIGSTOP a sí mismo debería hacer el truco. El comando de continuación del depurador emitirá el SIGCONT. Esto debería funcionar con GDB también. Alternativamente, intente SIGINT en lugar de SIGSTOP.

incluir un encabezado de

#include <signal.h> 
#include <csignal> // or C++ style alternative 

continuación

raise(SIGSTOP) 
+0

El comando gdb 'info signals' imprime la lista de señales y se pasan o no al programa. A continuación, puede modificar su comportamiento con el comando 'handle'. –

Cuestiones relacionadas