2008-09-19 14 views
78

Estoy intentando automatizar una sesión de gdb utilizando el indicador --command. Estoy tratando de establecer un punto de interrupción en una función en una biblioteca compartida (el equivalente de Unix de una DLL). Mi cmds.gdb se ve así:Cómo establecer puntos de interrupción en bibliotecas compartidas futuras con un indicador de comando

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

Sin embargo, yo estoy haciendo lo siguiente:

 
shlomi:~/progs/bugs-external/kde/font-breaking$ gdb --command=cmds.gdb... 
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux release 2009.0) 
Copyright (C) 2008 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "i586-mandriva-linux-gnu"... 
(no debugging symbols found) 
Function "IA__FcFontMatch" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal] 

Por lo tanto, no establece el punto de interrupción después de todo. ¿Cómo puedo hacer que sea predeterminado para responder "y" para establecer puntos de interrupción en la carga futura de la biblioteca compartida pendiente?

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

+0

relacionados: [se puede suprimir “de entrada no del terminal” del BGF mensajes?] (Http: // stackoverflow.com/questions/23005668/can-gdbs-input-not-from-terminal-messages-be-suppressed) – TooTone

Respuesta

123

En respuesta a mí mismo, me gustaría dar la respuesta que alguien me dio en el IRC:

 
(gdb) apropos pending 
actions -- Specify the actions to be taken at a tracepoint 
set breakpoint -- Breakpoint specific settings 
set breakpoint pending -- Set debugger's behavior regarding pending breakpoints 
show breakpoint -- Breakpoint specific settings 
show breakpoint pending -- Show debugger's behavior regarding pending breakpoints 

Y así establecer punto de interrupción pendiente en hace el truco; se usa en cmds.gdb como p. ej.

set breakpoint pending on 
break <source file name>:<line number> 
+6

yay! Aprendí algo nuevo sobre GDB hoy =) – Branan

+0

que ha guardado mi tocino intentando depurar en Windows 7 usando MinGW, la configuración predeterminada era diferente que en Linux - muchas gracias – bph

+0

Por alguna razón, recibo este error 'Programa recibido señal SIGILL, Instrucción ilegal'. Estoy obteniendo puntos de interrupción de un archivo y he 'establecido el punto de interrupción pendiente en' ya que algunos de mis puntos de interrupción se encuentran en una biblioteca que el programa carga. Si agrego puntos de corte manualmente, entonces no hay ningún error. ¿Alguien más enfrenta un problema similar? – brokenfoot

0

Tienes que entrar en main, por ejemplo, y correr hasta ese punto. Por lo tanto, las bibliotecas compartidas se cargarán.

explicado para apache

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 
8

OT: En el terminal se vería como este para depurar Caja en una línea:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync 
+2

¿Dónde encontraste el interruptor 'ex' ?, no puedo encontrar ninguna referencia a este parámetro en la documentación (pero funciona :)) –

+0

'-ex' no funcionó para mí. Tuve que poner los comandos en un archivo tmp y llamar con: 'gdb -x /tmp/gdb.commands myexecutible' –

Cuestiones relacionadas