7
votes

Débogage / traçage dans une bibliothèque partagée pendant l'exécution?

J'essaie de comprendre comment fonctionne une certaine bibliothèque. Je l'ai compilé avec mes prinfts ajoutés et tout est génial. Maintenant, je veux arrêter l'exemple du programme pendant l'exécution pour regarder la pile d'appels, mais je ne peux pas comprendre comment le faire avec GDB. La fonction que je veux briser, est dans une bibliothèque partagée. J'ai examiné un question précédente ici à ce sujet, mais l'approche ne " t Travailler pour moi. La langue en question est C ++. J'ai tenté de fournir le nom de fichier et le numéro de ligne, mais GDB refuse de comprendre que, il ne répertorie que les fichiers source de l'application DEMO.

Toute suggestion?


0 commentaires

3 Réponses :


4
votes

vous pouvez faire "briser la main" en premier. Au moment où vous frappez cela, la bibliothèque partagée doit être chargée et vous pouvez ensuite définir un point d'arrêt dans l'une de ses routines.


5 commentaires

Oui, mais assurez-vous que vous avez compilé cette bibliothèque avec -g, et avec des optimisations éteintes!


Malheureusement, cela n'a pas aidé. La fonction n'est toujours pas visible, même de la principale. Y a-t-il quelque chose que je puisse ajouter au code, pour que l'exécution s'arrête et tombe dans le débogueur?


@EighTyeight: Hmm, cela fonctionne pour moi. La bibliothèque que vous essayez de déboguer peut-être dynamiquement via Dlopen ()? Cela pourrait expliquer pourquoi ce n'est toujours pas visible dans la principale. Si tel est le cas, vous pouvez définir votre point d'arrêt initial après l'appel DLOPEN pour la bibliothèque cible, puis définir le point d'arrêt final. On dirait qu'il devrait y avoir une manière plus simple; Je vais continuer à regarder.


Au fait, dans ma candidature, si j'essaie de définir le point d'arrêt dans la bibliothèque partagée avant d'entrer dans Main (), GDB propose de faire en attente le point d'arrêt dans la charge de la bibliothèque partagée future. Mais si j'accepte cela, il ne semble pas résoudre le point d'arrêt, même après la charge de la bibliothèque. J'imagine que c'est ce que vous voyez aussi?


Oui, je devais recompiler la bibliothèque avec -g. Il n'aime toujours pas la notation de la classe :: Fonction () pour une raison quelconque, mais File.cpp: Linenumber fonctionne comme un charme.



3
votes

Il y a deux cas à prendre en compte (et votre question ne fait pas préciser ce que vous avez):
- Votre exécutable est directement liée à la bibliothèque partagée:
Cela signifie que gdb "voir" les symboles (et sources) de la bibliothèque partagée lorsque vous vous arrêtez sur la principale
- Votre exécutable charge de manière dynamique la bibliothèque partagée (par exemple via dlopen ):
Dans ce cas, gdb ne "voir" ne "voir" pas votre bibliothèque partagée jusqu'à après dlopen complète.

Puisque vous ne pouvez pas voir les symboles lorsque vous vous arrêtez à Main, je suppose que vous avez le deuxième cas. Vous pouvez faire "définir stop-on-solib-events 1" au (gdb) invite, et gdb arrêtera chaque fois un nouveau La bibliothèque partagée est chargée (ou non chargée).

Vous pouvez voir quelles bibliothèques gdb "sait" sur via info partagée commande.
Attendez juste que vous voyiez votre bibliothèque cible dans cette liste, avant de tenter de définir des points d'arrêt.


1 commentaires

Cette solution ne fonctionnera pas lors du débogage de l'application client SQLPlus d'Oracle



1
votes

Vérifiez ceci:

http://linux.die.net/man/1/ltrace

Il retracera vos appels de bibliothèque - probablement utile.

et "strace" fait la même chose pour les appels système.

Et avec cela, vous devriez pouvoir trouver un point d'entrée ... Vous pouvez définir un point d'arrêt dans GDB de cette façon (bien que je ne puisse pas expliquer moi-même les détails)


0 commentaires