Cómo establecer puntos de interrupción en futuras bibliotecas compartidas con una marca de comando

94

Estoy intentando automatizar una sesión de gdb usando la --commandbandera. Estoy tratando de establecer un punto de interrupción en una función en una biblioteca compartida (el equivalente en Unix de una DLL). Mi cmds.gdb se ve así:

set args /home/shlomi/conf/bugs/kde/font-break.txt
b IA__FcFontMatch
r

Sin embargo, obtengo lo siguiente:

shlomi: ~ / progs / bugs-external / kde / font-breaking $ gdb --comando = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (versión de Mandriva Linux 2009.0)
Copyright (C) 2008 Free Software Foundation, Inc.
Licencia GPLv3 +: GNU GPL versión 3 o posterior 
Este es un software gratuito: puede 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 detalles.
Este GDB se configuró como "i586-mandriva-linux-gnu" ...
(no se encontraron símbolos de depuración)
Función "IA__FcFontMatch" no definida.
¿Hacer que el punto de interrupción esté pendiente en la futura carga de la biblioteca compartida? (y o [n]) [respondió N; entrada no desde terminal]

Entonces, después de todo, no establece el punto de ruptura. ¿Cómo puedo hacer que la respuesta predeterminada sea "y" para establecer puntos de interrupción en la carga de la biblioteca compartida futura pendiente?

Recuerdo que pude hacer algo, pero no recuerdo qué.

Pez shlomi
fuente

Respuestas:

152

Respondiéndome a mí mismo, me gustaría dar la respuesta que alguien me dio en IRC:

(gdb) apropos pendiente
acciones: especifique las acciones que se realizarán en un punto de seguimiento
establecer punto de interrupción: configuración específica del punto de interrupción
establecer punto de interrupción pendiente: establece el comportamiento del depurador con respecto a los puntos de interrupción pendientes
mostrar punto de interrupción: configuración específica del punto de interrupción
mostrar punto de interrupción pendiente: muestra el comportamiento del depurador con respecto a los puntos de interrupción pendientes

Y así establecer un punto de interrupción pendiente de hacer el truco; se usa cmds.gdbcomo por ejemplo

set breakpoint pending on
break <source file name>:<line number>
Pez shlomi
fuente
que me ha salvado el tocino tratando de depurar en Windows 7 usando MinGW, la configuración predeterminada era diferente a la de Linux - muchas gracias
bph
Por alguna razón, obtengo este error Program received signal SIGILL, Illegal instruction. Estoy obteniendo puntos de interrupción de un archivo y lo he hecho, set breakpoint pending onya que algunos de mis puntos de interrupción están en una biblioteca que carga el programa. Si agrego puntos de interrupción manualmente, no hay ningún error. ¿Alguien más enfrenta un problema similar?
brokenfoot
@brokenfoot: Creo que debería hacer su pregunta en una nueva pregunta de nivel superior en lugar de en un comentario a una respuesta aquí. De esa manera, más personas lo notarán. Además, debe proporcionar más información sobre su sistema.
Shlomi pescado
11

OT: En la terminal, se vería así depurar Caja en una línea:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync
äxl
fuente
2
¿Dónde encontró el interruptor 'ex'? No puedo encontrar ninguna referencia a este parámetro en la documentación (pero funciona :))
Gearoid Murphy
-exno funcionó para mí. Tuve que poner los comandos en un archivo tmp y llamar con:gdb -x /tmp/gdb.commands myexecutible
Jason Moore
5

Sin símbolos.

objdump -t /lib/libacl.so
SYMBOL TABLE:
no symbols
objdump -T /lib/libacl.so
...
00002bd0 g    DF .text  000000d0  ACL_1.0     acl_delete_entry
...


(gdb) break 0x0002bd0 

(gdb) x/20i acl_delete_entry
0x2bd0 <acl_delete_entry>:      stwu    r1,-32(r1)
0x2bd4 <acl_delete_entry+4>:    mflr    r0
0x2bd8 <acl_delete_entry+8>:    stw     r29,20(r1)
0x2bdc <acl_delete_entry+12>:   stw     r30,24(r1)
0x2be0 <acl_delete_entry+16>:   mr      r29,r4
0x2be4 <acl_delete_entry+20>:   li      r4,28972
RandomNickName42
fuente