2010-08-14 10 views
15

? Estoy casi usando GDB por primera vez. corro¿Cómo detengo la continuación en GDB

$ gdb 

entonces yo estoy corriendo

attach <mypid> 

luego veo que mi proceso está estancado (que es probablemente correcto). Ahora quiero que continúe en funcionamiento, así que corro

continue 

y mi proceso continúa funcionando pero desde aquí estoy atascado si quiero volver a ver a mi pila traza actual, etc. No podía salir de Continuando ... Probé Ctrl - D etc. pero nada funcionó para mí ... (fue solo una suposición).

+0

Ctrl-c debería funcionar. –

+0

intenté también CTRL-C no lo hizo – Jas

+0

¿Qué quiere decir con atrapado? ¿Un bucle infinito? Ver también: http://stackoverflow.com/questions/8702658/gdb-how-do-i-pause-during-loop-execution –

Respuesta

11

Debe interrumpir el proceso que está conectado por gdb. No interrumpa el gdb. Interrumpa el proceso por ctrl-c en el terminal en que inició el proceso o envíe el proceso al SIGINT mediante kill -2 procid. Con procid la identificación del proceso que se adjunta.

+1

Es una pena que el host no pueda hacerlo cuando usa gdbserver/client. – barkside

+0

No desea decir lo obvio, pero solo funcionará si el programa no maneja SIGINT. Si hay un frenesí sigaddset en main() o algún init() ...;) – vesperto

4

Control + C en el proceso de gdb debería llevarlo nuevamente al símbolo del sistema.

+0

ctrl-c no funciona para mí, eche un vistazo por favor: ' bash- 3.00 # gdb GNU gdb 6.8 Copyright (C) 2008 Free Software Foundation, Inc. Licencia GPLv3 +: GNU GPL versión 3 o posterior Este es software gratuito: eres libre de cambiarlo y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Escriba "Mostrar copia" y "mostrar garantía" para obtener más información. Este GDB se configuró como "i386-pc-solaris2.10". (BGF) adjuntar 4305 Colocación de procesar 4305 reintento # 1: reintento # 2: ' – Jas

+0

 Retry #3: Retry #4: [New LWP 1] 0xfef298b5 in ??() (gdb) info frame Stack level 0, frame at 0x80477c8: eip = 0xfef298b5; saved eip 0xfef1b5d2 Arglist at 0x80477c0, args: Locals at 0x80477c0, Previous frame's sp is 0x80477c8 Saved registers: eip at 0x80477c4 (gdb) print The history is empty. (gdb) continue Continuing. ^D ^C quit ^C^C^C ^C 
Jas

+0

cómo puedo formatear este PLZ? tuve esto en líneas separadas, ¿cómo lo tengo también en los comentarios lo pegué en líneas separadas, por favor? – Jas

4

Aquí hay un corto GDB tutorial, y aquí hay un full GDB manual.

El objetivo de la depuración es inspeccionar partes interesantes/sospechosas del programa. Breakpoints le permiten detener la ejecución en alguna ubicación de origen, y watchpoints le permiten detenerse cuando cambian los datos interesantes.

ejemplos simples:

(gdb) break my_function 
(gdb) cont 

Esto insertará un punto de interrupción al principio del my_function, por lo que cuando la ejecución del programa entra en la función se suspendió el programa y se obtiene GDB de órdenes de vuelta, y ser capaz de inspect program's state. O puede step a través del código.

(gdb) watch my_var 
(gdb) cont 

mismo, pero ahora el programa se detendrá en cualquier ubicación que modifica el valor de my_var.

Enchufe desvergonzado - aquí hay un enlace a mi GDB presentation en NYC BSD User Group. Espero que esto ayude.

+0

pero solo quería elegir un punto en el tiempo y en ese momento examinar el seguimiento de la pila ... y luego continuar el programa, no quería puntos de interrupción ... en mi caso, quiero examinar el apila el rastro del programa en un momento mío. – Jas

+0

OK, ¿qué dice 'info signal' sobre' SIGINT'? –

+0

@Jas ¿qué uso posible es interrumpir aleatoriamente un programa en ejecución para examinar el seguimiento de la pila? Todo lo que encontrará es que el código que está actualmente en la pila es el código que se está ejecutando. Por lo general, este es un bucle en espera de la entrada del usuario. Ho hum. – theMayer

Cuestiones relacionadas