2010-04-15 25 views
9

J'ai une bibliothèque partagée libtest.so qui sera chargée dans le programme principal en utilisant dlopen. La fonction test() réside dans libtest.so et sera appelée dans le programme principal par dlsym. Y at-il un moyen que je pourrais mettre en place un point de rupture sur test?comment définir le point d'arrêt sur la fonction dans une bibliothèque partagée qui n'a pas été chargée dans gdb

Veuillez noter que le programme principal n'a pas été lié à libtest.so pendant l'heure de la liaison. Sinon, je devrais être en mesure de définir le point de rupture, bien qu'il s'agisse d'une action en attente. Dans mon cas, quand je fais b test, gdb me dira Function "test" not defined.

+0

Pourriez-vous mettre un point d'arrêt sur 'test' après le chargement' 'libtest.so' avec dlopen'? –

Répondre

11

En fait gdb devrait vous dire qu'il est en mesure de résoudre le symbole à l'avenir, lorsque de nouvelles bibliothèques sont chargées:

(gdb) b test 
Function "test" not defined. 
Make breakpoint pending on future shared library load? (y or [n]) y 
Breakpoint 1 (test) pending. 
(gdb) r 

Et plus tard, une fois l'objet .donc est chargé, il résoudra le point d'arrêt, par exemple:

Reading symbols for shared libraries . done 
Breakpoint 1 at 0xcafebebe 
Pending breakpoint 1 - "test" resolved 
+0

Sur le GDB que j'utilise, même si je "définit le point d'arrêt en attente", il ne me demandera pas si je veux le comportement en attente si le symbole n'est pas défini. Il me dit simplement "Impossible de trouver le membre bla bla Astuce essayez l'onglet bla bla" –

6

En fait, cette méthode ne fonctionnera pas toujours. Supposons que j'ai plusieurs bibliothèques partagées qui ont chacune une fonction nommée "Init". Si j'ai chargé une bibliothèque différente, "b Init" va définir le point d'arrêt sur la mauvaise instance de la fonction "Init". Je dois donc préciser le point d'arrêt comme celui-ci:

(gdb) b object5.c: 66

Aucun fichier source nommé object5.c.

+0

Dans mon cas, le problème que j'ai trouvé, je dois compiler avec les symboles de débogage (pour mettre des points d'arrêt dans un fichier .so personnalisé). –

1

comment définir un point d'arrêt sur une bibliothèque partagée.

[Il est fréquent d'avoir un point d'arrêt dans une bibliothèque partagée. Les bibliothèques partagées peuvent être chargées et déchargées explicitement, et peut-être de façon répétée, lorsque le programme est exécuté. Pour prendre en charge ce cas d'utilisation, gdb met à jour les emplacements de points d'arrêt chaque fois qu'une bibliothèque partagée est chargée ou déchargée. En règle générale, vous devez définir un point d'arrêt dans une bibliothèque partagée au début de votre session de débogage, lorsque la bibliothèque n'est pas chargée et lorsque les symboles de la bibliothèque ne sont pas disponibles. Lorsque vous essayez de définir point d'arrêt, gdb vous demandera si vous souhaitez définir un soi-disant en attente breakpoint-point d'arrêt dont l'adresse est pas encore résolu.]

citation de https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html

(gdb) b object5.c: 66 Aucun fichier source nommé object5.c.

vous pouvez peut-être utiliser "répertoire défini the_location_of_object5.c_file" pour y remédier.

  • Liste item
0

Une autre façon est de spécifier la fonction de nom de fichier et der, .: par exemple

b object5.c:test 

Cela devrait être unique.Peut-être que vous voulez aussi spécifier le chemin d'accès au code source (comme cela a déjà suggéré) par:

set directories path_of_object5.c