OK, info romper las listas de los puntos de ruptura, pero no en un formato que funcione bien con la reutilización de ellos utilizando la opción –comando como en esta pregunta. ¿Gdb tener un método para dejarlos en un archivo aceptable para la entrada de nuevo? A veces en una sesión de depuración, es necesario reiniciar gdb después de la construcción de un conjunto de puntos de corte para la prueba.

Edición: el .gdbinit archivo tiene el mismo problema que –comando. La info comando break, no una lista de comandos, pero en lugar de una tabla para el consumo humano.

A elaborar, aquí se muestra un ejemplo de información de la rotura:

(gdb) info romper 
Num Tipo Disp Enb Dirección De Lo Que 
1 punto de interrupción mantener y 0x08048517 <foo::bar(void)+7> 
InformationsquelleAutor casualcoder | 2009-02-01

12 Comentarios

  1. 193

    Como de gdb 7.2 ahora, usted puede usar la función guardar los puntos de interrupción de comandos.

    save breakpoints <filename>
      Save all current breakpoint definitions to a file suitable for use
      in a later debugging session.  To read the saved breakpoint
      definitions, use the `source' command.

    Uso source <filename> para restaurar la guarda puntos de interrupción en el archivo.

    • No ver esta respuesta, lo comprobará.
    • ¿qué acerca de si son de un lib compartido de la carga? Respuestas N por defecto parece… Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]
    • uso set breakpoint pending on como se describe en como respuesta Y en gdb script y gdb: cómo establecer puntos de interrupción en el futuro de las bibliotecas compartidas con un –comando de la bandera
    • Esta respuesta ha sido promovida para la `aceptado» como respuesta. Los tiempos cambian, el software más.
    • Tenga en cuenta que cuando usted tiene un punto de interrupción en la condición que no puede ser resuelto en el inicio (break g_log if log_level==G_LOG_LEVEL_CRITICAL), entonces al menos gdb 7.8.1 dejará de análisis más comandos. Si usted tiene comandos adicionales que deben ser ejecutadas para que el punto de interrupción, poner el commands línea antes de la condition línea.
    • Revierte la edición, a mi original blockquote porque el texto es una cita textual de la documentación… yo me acuerdo en contrario con su editar si fueran mis propias palabras en su lugar.
    • Lo que yo veo. Yo recomendaría usar la cotización de estilo en lugar de que el código de estilo en cualquier caso.
    • El .gdbinit no trabajan con «cgdb’, así que estoy bien con la explícita » guardar puntos de interrupción /tmp/pointbreak.dbg «y su opuesto» fuente /tmp/pointbreak.dbg’

  2. 26

    Esta respuesta es obsoleta, gdb ahora permite guardar directamente. Ver esta respuesta.

    Usted puede usar el registro:

    (gdb) b main
    Breakpoint 1 at 0x8049329
    (gdb) info break
    Num     Type           Disp Enb Address    What
    1       breakpoint     keep y   0x08049329 <main+16>
    (gdb) set logging file breaks.txt
    (gdb) set logging on
    Copying output to breaks.txt.
    (gdb) info break
    Num     Type           Disp Enb Address    What
    1       breakpoint     keep y   0x08049329 <main+16>
    (gdb) q

    El archivo breaks.txt ahora contiene:

    Num     Type           Disp Enb Address    What
    1       breakpoint     keep y   0x08049329 <main+16>

    La escritura de un guión awk que se transforma en un formato útil para el .gdbinit o un --command archivo es fácil. O usted puede incluso hacer que el script se emiten por separado --eval-command‘s para el gdb de la línea de comandos…

    La adición de esta pequeña macro .gdbinit te ayudará a hacerlo:

    # call with dump_breaks file.txt
    define dump_breaks
        set logging file $arg0
        set logging redirect on
        set logging on
        info breakpoints
        set logging off
        set logging redirect off
    end
    • Uno podría simplemente usar cortar y pegar, pero el método de secuencias de comandos parece ser el camino a seguir.
    • no creo que cortar y pegar es más fácil de lo que acaba de escribir un guión de una vez, a continuación, utilizando cada vez de nuevo 🙂 después de todo, esa era la razón por la que usted esta pregunta en primer lugar, creo 🙂
    • Um, me refería a usar cortar y pegar en lugar del método de registro. Las secuencias de comandos está tan lejos seguro.
    • +1 en Sus esfuerzos son descaradamente apreciado
    • wow! gdb fallar! Yo lo uso todos los días y el amor muchas de sus características. Pero la falta es simplemente tonto.
    • Esta respuesta es ahora de más de 2 años de edad, por lo que puede ser obsoleto si usted está utilizando una versión más reciente de gdb. Como de gdb 7.2 usted puede ahora utilizar el save breakpoints comando.
    • Esta respuesta es útil para aquellos de nosotros que necesitamos para trabajar con sistemas heredados.

  3. 11

    Poner sus comandos de gdb y los puntos de interrupción en una .gdbinit archivo como tipo de ellos en el gdb> símbolo de sistema, y gdb se carga automáticamente y ejecutar en el inicio. Este es un directorio de archivo, de modo que usted puede tener archivos diferentes para diferentes proyectos.

    • En realidad, esto no funciona, me sale «advertencia: save-puntos de seguimiento: no hay puntos de seguimiento para guardar.’ Esto a pesar de los puntos de interrupción se va a establecer. Usando gdb 6.8.
    • Esto funciona para mí. GDB necesita la presencia de un mundial .gdbinit en su $HOME/.gdbinit con el contenido de ‘add-auto-carga-caja de seguridad-ruta /home/johnny/src/.gdbinit’ y por lo tanto la src/ carpeta separada .gdbinit
  4. 9

    Una extensión anon extensión a Johannes’ respuesta:

    .gdbinit:
    
    define bsave
        shell rm -f brestore.txt
        set logging file brestore.txt
        set logging on
        info break
        set logging off
        # reformat on-the-fly to a valid gdb command file
        shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
    end 
    document bsave
      store actual breakpoints
    end
    
    define brestore
      source brestore.gdb
    end
    document brestore
      restore breakpoints saved by bsave
    end

    Con brestore a continuación, puede restaurar los puntos de interrupción guarda con bsave.

    • Aquí está una mejor regex : perl -ne «print \»break \$1 \n\» si /a\s(.*:\d+)/» brestore.txt
  5. 6

    Extensión de la respuesta de Johannes: puede formatear automáticamente la salida de info break en un válido gdb archivo de comandos:

    .gdbinit:
    
    define bsave
       shell rm -f brestore.txt
       set logging file brestore.txt
       set logging on
       info break
       set logging off
       # reformat on-the-fly to a valid gdb command file
       shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
    end 
    document bsave
      store actual breakpoints
    end

    Después usted tiene una validez commandfile en brestore.gdb

    Esto funcionó para mí cuando se compila la aplicación con -g.

    EDITAR: probado con éxito con gdb v6.8 en Ubuntu Karmic.

    • Gracias por este fragmento de código! Las grandes obras. Probado con éxito con GNU gdb 6.3.50-20050815 (versión para Apple gdb-966) en CarbonEmacs GNU Emacs 22.3.1 (i386-apple-darwin9.6.0, de Carbono de la Versión 1.6.0) en Mac OS 10.5.8.
  6. 3

    poner lo siguiente en ~/.gdbinit para definir bsave y brestaurará como gdb comandos para guardar y restaurar los puntos de interrupción.

    define bsave
        save breakpoints ~/.breakpoints
    end
    
    define brestore
       source ~/.breakpoints
    end
  7. 1

    advertencia: Corriente de salida de protocolo
    no apoyo la redirección de

    También tengo este error/advertencia en GDB cuando tratando de habilitar el registro en TUI modo, sin embargo, el registro parece funcionar cuando en «no-TUI» de modo. Así que os dejo TUI modo cada vez que quiero iniciar algo. (Alternar en TUI modo con CTRL-X, CTRL-UN).

    He aquí cómo yo trabajo:

    1. inicio GDB (en modo normal)
    2. habilitar el registro: set logging on – ahora no debería quejarse.
    3. alternar atrás/adelante a TUI y modo de hacer el GDB cosas
    4. whenver quiero iniciar algo (como un enorme traza de volcado) – cambiar a modo normal

    Espero que esto ayude,
    /M:o)

    • Ah, y si te gusta el uso de «pantalla» (como yo) se obtendrá un poco desordenado, ya que utiliza el mismo teclas de acceso rápido.
  8. 1

    Sé que este es un hilo viejo, pero apareció en mi búsqueda de google para que me ayude a hacer esto. Soy nuevo en el gdb y se encontró la siguiente adición a la respuesta anterior útil para guardar/cargar los puntos de corte para un archivo específico.

    • Guardar los puntos de interrupción: bsave {nombre de archivo}
    • De carga de los puntos de interrupción: bload {nombre de archivo}

    Como el anterior agregue el código siguiente al archivo ~/.gdbinit

    #Save breakpoints to a file
    define bsave
        if $argc != 1
            help bsave
        else
        save breakpoints $arg0
        end
    end
    document bsave
    Saves all current defined breakpoints to the defined file in the PWD
    Usage: bsave <filename>
    end
    
    #Loads breakpoints from a file
    define bload
        if $argc != 1
            help bload
        else
            source $arg0
        end
    end
    document bload
    Loads all breakpoints from the defined file in the PWD
    Usage: bload <filename>
    end
  9. 0

    El problema es que, establecer un punto de interrupción es el contexto sensative.
    Lo que si tiene dos funciones estáticas llamado foo? Si usted está
    ya depuración de uno de los módulos que define foo, luego
    gdb asumirá que significaba que uno. Pero si usted acaba de volcar
    «romper foo» en un archivo y, a continuación, lea el archivo en el inicio,
    no va a ser claro que la función foo que quieres decir.

  10. 0

    Cualquier otra idea? Tengo

    warning: Current output protocol does not support redirection

    después de

    set logging on

    EDICIÓN:

    Sé que la pregunta es «cómo guardar una lista de puntos de interrupción», sin embargo acabo de descubrir, que con gdb podemos simplemente un conjunto de «guardado en el archivo» puntos de interrupción por

    gdb> source breakpoints.txt

    donde breakpoints.txt es un archivo como este:

    break main.cpp:25
    break engine.cpp:465
    break wheel.cpp:57
  11. 0

    El problema es que, establecer un punto de interrupción es el contexto sensative. Lo que si
    tiene dos funciones estáticas llamado foo? Si ya de depuración
    uno de los módulos que define foo, luego gdb asumirá que significaba
    que uno. Pero si usted acaba de volcar «romper foo» en un archivo y, a continuación, leer
    ese archivo en el inicio, no va a ser claro que la función foo usted
    decir.

    No tengo el mod puntos a la respuesta, pero lo que tienes que hacer es hacer que sus puntos de ruptura explícita, especificando el archivo de origen y el número de línea.
    Si foo() se especifica en tanto foo.c:42, y en el bar.c:1337

    break foo.c:42
    break bar.c:1337

    Como alternativa, puede especificar una fuente de punto de interrupción que sólo se activará si el programa se ejecuta en gdb. Ver Cómo detectar si el proceso actual está siendo ejecutado por GDB?

Dejar respuesta

Please enter your comment!
Please enter your name here