Comment définir des points d'arrêt sur les futures bibliothèques partagées avec un indicateur de commande

93

J'essaye d'automatiser une session gdb en utilisant le --commanddrapeau. J'essaie de définir un point d'arrêt sur une fonction dans une bibliothèque partagée (l'équivalent Unix d'une DLL). Mon cmds.gdb ressemble à ceci:

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

Cependant, j'obtiens ce qui suit:

shlomi: ~ / progs / bugs-external / kde / font-casser $ gdb --command = cmds.gdb ...
GNU gdb 6.8-2mdv2009.0 (Mandriva Linux version 2009.0)
Copyright (C) 2008 Free Software Foundation, Inc.
Licence GPLv3 +: GNU GPL version 3 ou ultérieure 
Il s'agit d'un logiciel gratuit: vous êtes libre de le modifier et de le redistribuer.
Il n'y a AUCUNE GARANTIE, dans la mesure permise par la loi. Tapez "show copying"
et "Afficher la garantie" pour plus de détails.
Ce GDB a été configuré comme "i586-mandriva-linux-gnu" ...
(aucun symbole de débogage trouvé)
La fonction "IA__FcFontMatch" n'est pas définie.
Rendre le point d'arrêt en attente sur le futur chargement de la bibliothèque partagée? (o ou [n]) [répondu N; entrée ne provenant pas de la borne]

Cela ne définit donc pas le point d'arrêt après tout. Comment puis-je définir par défaut la réponse "y" pour définir des points d'arrêt sur le futur chargement de la bibliothèque partagée en attente?

Je me souviens que j'ai pu faire quelque chose, mais je ne me souviens pas quoi.

Poisson Shlomi
la source

Réponses:

150

En me répondant, j'aimerais donner la réponse que quelqu'un m'a donnée sur IRC:

(gdb) à propos en attente
actions - Spécifiez les actions à entreprendre à un point de trace
set breakpoint - Paramètres spécifiques au point d'arrêt
set breakpoint pending - Définit le comportement du débogueur concernant les points d'arrêt en attente
show breakpoint - Paramètres spécifiques aux points d'arrêt
show breakpoint pending - Afficher le comportement du débogueur concernant les points d'arrêt en attente

Et donc définir le point d'arrêt en attente sur fait l'affaire; il est utilisé cmds.gdbcomme par exemple

set breakpoint pending on
break <source file name>:<line number>
Poisson Shlomi
la source
qui a sauvé mon bacon en essayant de déboguer sous Windows 7 en utilisant MinGW, le paramètre par défaut était différent de celui sous Linux - merci beaucoup
bph
Pour une raison quelconque, j'obtiens cette erreur Program received signal SIGILL, Illegal instruction. Je recherche des points d'arrêt à partir d'un fichier et je l'ai set breakpoint pending ondepuis certains de mes points d'arrêt sont dans une bibliothèque que le programme charge. Si j'ajoute des points d'arrêt manuellement, il n'y a pas d'erreur. Quelqu'un d'autre fait face à un problème similaire?
brokenfoot
@brokenfoot: Je pense que vous devriez poser votre question dans une nouvelle question de premier niveau plutôt que dans un commentaire à une réponse ici. De cette façon, plus de gens le remarqueront. De plus, vous devriez fournir plus d'informations sur votre système.
Shlomi Fish
11

OT: Dans le terminal, cela ressemblerait à ceci pour déboguer Caja en une seule ligne:

gdb -ex "set breakpoint pending on" -ex "break gdk_x_error" -ex run --args caja --sync
äxl
la source
2
Où avez-vous trouvé le commutateur 'ex'?, Je ne trouve aucune référence à ce paramètre dans la documentation (mais ça marche :))
Gearoid Murphy
-exn'a pas fonctionné pour moi. J'ai dû mettre les commandes dans un fichier tmp et appeler avec:gdb -x /tmp/gdb.commands myexecutible
Jason Moore
5

Sans symboles.

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
la source