Come impostare i punti di interruzione sulle future librerie condivise con un flag di comando


92

Sto cercando di automatizzare una sessione gdb utilizzando il --commandflag. Sto cercando di impostare un punto di interruzione su una funzione in una libreria condivisa (l'equivalente Unix di una DLL). Il mio cmds.gdb ha questo aspetto:

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

Tuttavia, sto ottenendo quanto segue:

shlomi: ~ / progs / bugs-external / kde / font-breaking $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux versione 2009.0)
Copyright (C) 2008 Free Software Foundation, Inc.
Licenza GPLv3 +: GNU GPL versione 3 o successiva 
Questo è un software gratuito: sei libero di modificarlo e ridistribuirlo.
NESSUNA GARANZIA, nella misura consentita dalla legge. Digita "mostra copia"
e "mostra garanzia" per i dettagli.
Questo GDB è stato configurato come "i586-mandriva-linux-gnu" ...
(nessun simbolo di debug trovato)
Funzione "IA__FcFontMatch" non definita.
Rendere il punto di interruzione in sospeso sul futuro caricamento della libreria condivisa? (yo [n]) [ha risposto N; input non dal terminale]

Quindi, dopotutto, non imposta il punto di interruzione. Come posso impostare come impostazione predefinita la risposta "y" per impostare i punti di interruzione in attesa del caricamento futuro della libreria condivisa?

Ricordo che ero in grado di fare qualcosa, ma non ricordo cosa.


Risposte:


149

Rispondendo a me stesso, vorrei dare la risposta che qualcuno mi ha dato su IRC:

(gdb) in sospeso
azioni - Specifica le azioni da intraprendere in un punto di traccia
set breakpoint - Impostazioni specifiche del punto di interruzione
set breakpoint pending - Imposta il comportamento del debugger riguardo ai breakpoint in sospeso
show breakpoint - Impostazioni specifiche del breakpoint
show breakpoint pending - Mostra il comportamento del debugger riguardo ai breakpoint in sospeso

E quindi impostare il punto di interruzione in sospeso su fa il trucco; è usato in cmds.gdbcome ad es

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

che ha salvato la mia pancetta cercando di eseguire il debug su Windows 7 utilizzando MinGW, l'impostazione predefinita era diversa rispetto a Linux - molte grazie
bph

Per qualche motivo, ottengo questo errore Program received signal SIGILL, Illegal instruction. Sto recuperando i punti di interruzione da un file e ho set breakpoint pending onpoiché alcuni dei miei punti di interruzione si trovano in una libreria che il programma carica. Se aggiungo manualmente i punti di interruzione, non ci sono errori. Qualcun altro sta affrontando un problema simile?
piede rotto

@brokenfoot: penso che dovresti porre la tua domanda in una nuova domanda di primo livello invece che in un commento a una risposta qui. In questo modo più persone lo noteranno. Inoltre, dovresti fornire maggiori informazioni sul tuo sistema.
Shlomi Fish

11

OT: Nel terminale sarebbe simile a questo per eseguire il debug di Caja in una riga:

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

2
Dove hai trovato l'interruttore 'ex'? Non riesco a trovare alcun riferimento a questo parametro nella documentazione (ma funziona :))
Gearoid Murphy

-exnon ha funzionato per me. Ho dovuto mettere i comandi in un file tmp e chiamare con:gdb -x /tmp/gdb.commands myexecutible
Jason Moore

5

Senza simboli.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.