Je veux déboguer un processus s'exécutant sur Linux 2.6 en utilisant GDB. attach PID
(où PID est l'ID de processus), print main
, print sin
, print gzopen
et print dlopen
travail (c'est-à-dire qu'ils trouvent les symboles respectifs). Mais print myfoo
ne fonctionne pas, où myfoo
est une fonction chargée par le processus à partir d'un fichier .so
en utilisant dlopen
. Voici ce que je reçois:Comment créer des symboles d'impression gdb dans des bibliothèques partagées chargées avec dlopen?
(gdb) print main
$3 = {int (int, char **)} 0x805ba90 <main>
(gdb) print sin
$4 = {<text variable, no debug info>} 0xb77<sin>
(gdb) print gzopen
$5 = {<text variable, no debug info>} 0xb720df50 <gzopen>
(gdb) print dlopen
$6 = {<text variable, no debug info>} 0xb77248e0 <__dlopen_nocheck>
(gdb) print myfoo
No symbol "myfoo" in current context.
Comment puis-je obtenir GDB trouver myfoo
? La fonction myfoo
existe en effet, car dans le programme j'ai réussi à obtenir son adresse en utilisant dlsym
(après dlopen
), et j'ai réussi à l'appeler. Seulement après que j'ai joint GDB au processus.
Il s'est avéré qu'un message d'erreur mydir/mylib.so: No such file or directory
a été imprimé par la commande attach $PID
de GDB. Apparemment, GDB a été démarré dans le mauvais répertoire. Faire le bon cd
avant de commencer GDB a corrigé le problème, et print myfoo
a commencé à travailler.
Je voudrais automatiser ceci: Je veux que GDB découvre où mes fichiers .so
(chargés avec dlopen
) sont. Une approximation que je peux penser est l'examen /proc/$PID/maps
(sur Linux), la recherche de répertoires possibles, et l'ajout de tous dans le chemin de recherche de la bibliothèque GDB avant de démarrer GDB. Étendre LD_LIBRARY_PATH
et faire un set solib-search-path /tmp/parent
ne fonctionnait pas (ls -l /tmp/parent/mydir/myfoo.so
ne fonctionne pas), GDB signalait toujours le No such file or directory
. Comment puis-je dire à GDB où chercher mydir/myfoo.so
?
Mon autre question est comment puis-je obtenir la liste des répertoires possibles? Sur Linux, /proc/$PID/maps
les contient - mais qu'en est-il des autres systèmes d'exploitation comme FreeBSD et Mac OS X?
Fonctionne bien pour moi. Publiez du code. Quels drapeaux passez-vous à 'dlopen'? –
Hmm, en parcourant les messages d'erreur GDB lors de l'attachement, j'ai trouvé 'mylib.so: No tel fichier ou répertoire'. Après avoir fait le bon 'cd' avant de démarrer GDB,' print myfoo' a commencé à fonctionner. Mais je voudrais automatiser cela (donc 'cd' n'est pas requis). J'ai élargi la question. – pts