2011-05-02 13 views
25

Normalmente, cuando ejecuta un programa a través de GDB puede presionar Ctrl + C para interrumpirlo, p. si se queda atascado en un bucle infinito y quieres obtener un seguimiento.GDB: Ctrl + C no interrumpe el proceso como suele hacerlo, sino que termina el programa

Estoy depurando un programa (xmms2d como ocurre) pero en este programa solamente, cuando presiono Ctrl + C se trata como si GDB no se estuviera ejecutando - el programa se cierra limpiamente y luego GDB me dice que el programa salió normalmente

¿Cómo recupero el comportamiento habitual de GDB, donde Ctrl + C interrumpe el programa? ¿O hay otra forma de producir la misma reacción en GDB que una Ctrl + C normalmente?

+0

¿Cuál es su versión de GDB y OS? ¿Puedes producir un programa C mínimo donde también ocurre? –

+0

@CiroSantilli This iro iro This This This This This: Este problema fue resuelto hace cuatro años (ver a continuación). ¡Probablemente ya no sea relevante un programa de ejemplo! – Malvineous

+0

Más de 1000 personas vienen aquí todos los años en busca de respuestas :-) Las nuevas preguntas se pueden cerrar como duplicados de esta. Pero no te culpo si olvidaste los detalles. –

Respuesta

22

Apuesto a que xmms2d está usando sigwait() para manejar las señales, lo que rompe la capacidad de gdb para atrapar CTRL-C. Veo https://bugzilla.kernel.org/show_bug.cgi?id=9039

Tengo una idea para una solución mediante la lectura de Continue to debug after failed assertion on Linux? - cuando esté listo para romper en GDB, corro "matar -TRAP <pid>" de otra ventana de terminal.

+0

Eso funciona perfectamente, gracias por la respuesta! – Malvineous

+0

Lamentablemente, no pude desbloquear gdb de esa manera cuando el proceso subyacente se bloquea. Tanto gdb como mi proceso todavía cuelgan :-(¿Algún consejo? – lethalman

0

Puede cambiar de destino de entrada/salida del BGF con el siguiente comando:

gdb -tty = /dev/tty1 
+0

Esto no soluciona el problema. La salida va a la otra terminal, pero cuando presiona Ctrl + C en la terminal de gdb, el programa que se está depurando aún capta el señal y sale limpiamente, como si no hubieras cambiado el tty en absoluto. – Malvineous

5

En el símbolo del BGF que puede hacer "manejar parada SIGINT" para que el BGF atrapa CTRL-C

+0

esto lo hizo por mí, gracias –

+0

¡esta solución funcionó para mí! –

3

tuve misma problema causado por controladores de señal SDL que interfieren con gdb. Una solución que se encontró para solucionar este al iniciar GDB:

start 
call sigignore(2) 
continue 

Ahora todo CTRL-C será ignorado por la aplicación.

Si attach a algún proceso y desea restaurarlo a su estado original después de debuging, usted puede hacer esto:

set $oldcallback = signal(2, 0) 
call sigignore(2) 
continue 

Y cuando haya terminado:

call signal(2, $oldcallback) 
detach 
Cuestiones relacionadas