2010-12-08 38 views
8

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?

+0

Fonctionne bien pour moi. Publiez du code. Quels drapeaux passez-vous à 'dlopen'? –

+0

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

Répondre

0

Il semblerait qu'il n'y ait aucun moyen facile d'automatiser la recherche de fichiers .so dans GDB.

0

Je gère un programme qui charge une bibliothèque partagée via dlopen() et qui a accédé avec succès aux symboles de la bibliothèque partagée à l'aide de GDB. Cela ne fonctionnera cependant que si la bibliothèque partagée possède une table de symboles.

+0

Oui, cela fonctionne aussi pour moi si je démarre GDB à partir du bon répertoire. J'ai élargi la question à propos de l'automatisation de cela. – pts

3

La commande "info target" dans gdb affichera une liste de toutes les sections de tous les objets partagés chargés (y compris les bibliothèques ed dlopen()). Au moins, cela fonctionne sur Linux - Je ne sais pas comment il se comporte sur d'autres systèmes d'exploitation.