Forum Programmation.c GDB : comment afficher le module contenant une fonction dans la pile d'appel ?

Posté par . Licence CC by-sa
4
24
juin
2014

Bonjour,

Je rencontre une difficulté avec GDB en voulant déboguer un programme. La commande bt permet d'afficher la pile d'appel quand le programme est mis en pause. Parfois, l'affichage retourne les noms des fonctions, parfois, le nom du module (exe ou so) dans lequel se trouve la fonction. Ce que j'aimerais, c'est pouvoir afficher les deux, car je suis parfois perdu pour déterminer les modules impliqués.

Par exemple j'ai :

#0 0x00001234 in une_fonction() ()
#1 0x00f00500 in une_autre_fonction() ()
#2 0x000a0060 in encore_une_fonction() ()

Ce que je voudrais afficher, c'est ça :

#0 0x00001234 in une_fonction() ()        from /usr/lib/unelib.so
#1 0x00f00500 in une_autre_fonction() ()  from /usr/lib/uneautrelib.so
#2 0x000a0060 in encore_une_fonction() () from /home/moi/monapp

Je peine à chercher sur le Web et dans la doc de GDB. Si vous avez la réponse, je vous en serai reconnaissant.

  • # Sujet du commentaire

    Posté par . Évalué à 2.

    Il me semble que lorsque tu as l'affichage simple, le symbole provient d'un objet lié statiquement à l'exécutable. La command 'info symbol 0x[adresse]' te donne plus d'info quant à la définition du symbole. Maintenant j'imagine que le nom de l'objet n'est pas toujours disponible non plus. Tu peux aussi regarder du côté des commandes binutils (objdump, nm, readelf, …) sur les exécutable, objet et libraires pour savoir exactement ce qui est défini, comment et où (n'hésite pas à revenir avec une question plus précise par la suite). grep aussi est parfois très utile comme première recherche…

    • [^] # Re: Sujet du commentaire

      Posté par . Évalué à 1.

      Je viens de tester 'info symbol' et ça permet d'obtenir l'information qui me manquait, merci. C'est un peu fastidieux de l'appeler pour chaque ligne de la pile d'appel, mais c'est toujours ça.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.