web-dev-qa-db-fra.com

Comment charger plusieurs fichiers de symboles dans gdb

Comment charger plusieurs fichiers de symboles dans gdb. J'ai un exécutable foo.out et le chargement d'un module bar.so. J'ai créé deux fichiers de symboles foo.symbol et bar.symbol. Comment charger les deux fichiers dans gdb. 

# gdb --core core
# (gdb) 
# (gdb) symbol-file foo.symbol

Comment charger le deuxième fichier de symboles. Ou est-il possible de charger tous les fichiers du répertoire dans gdb

24
Ibrar Ahmed

Pour définir le répertoire contenant le fichier de symboles, utilisez

set debug-file-directory <directory>

et utilise

show debug-file-directory

pour montrer ce qui est actuellement défini comme répertoire contenant des fichiers de symboles.

Les fichiers de symboles sont lus automatiquement à partir de ce répertoire si leur nom (sans chemin) est fourni par le binaire en tant que lien de débogage.


Pour ajouter des symboles supplémentaires, vous pouvez utiliser add-symbol-file.

(comme le gdb onlinedocs semble être indisponible pour le moment, je le cite ici)

add-symbol-file nom du fichier adresse

add-symbol-file nom du fichier adresse [-readnow] [-mapped]

add-symbol-file nom_fichier -adresse de sélection ...

La commande add-symbol-file lit des informations supplémentaires sur la table des symboles à partir du fichier filename. Vous utiliseriez cette commande lorsque le nom de fichier a été chargé dynamiquement (par un autre moyen) dans le programme en cours d'exécution. adresse devrait être l'adresse de la mémoire à laquelle le fichier a été chargé; GDB ne peut pas comprendre cela par lui-même. Vous pouvez également spécifier un nombre arbitraire de paires «-ssection adresse» afin de donner un nom de section explicite et une adresse de base pour cette section. Vous pouvez spécifier n'importe quelle adresse en tant qu'expression. 

La table des symboles du fichier nom_fichier est ajoutée à la table des symboles lue à l'origine avec la commande symbol-file. Vous pouvez utiliser la commande add-symbol-file autant de fois que vous le souhaitez. les nouvelles données de symboles ainsi lues continuent de s'ajouter aux anciennes. Pour abandonner toutes les anciennes données de symbole, utilisez la commande symbol-file sans aucun argument.

Bien que nomfichier soit généralement un fichier de bibliothèque partagée, un fichier exécutable ou un autre fichier objet entièrement déplacé pour être chargé dans un processus, vous pouvez également charger des informations symboliques à partir de fichiers .o déplaçables, à condition que:

  • les informations symboliques du fichier ne font référence qu'aux symboles de l'éditeur de liens définis dans ce fichier, et non aux symboles définis par d'autres fichiers objets,
  • chaque section à laquelle les informations symboliques du fichier font référence a effectivement été chargée dans la partie inférieure, telle qu'elle apparaît dans le fichier, et
  • vous pouvez déterminer l'adresse à laquelle chaque section a été chargée et les fournir à la commande add-symbol-file. 

Certains systèmes d'exploitation intégrés, tels que Sun Chorus et VxWorks, peuvent charger des fichiers déplaçables dans un programme déjà en cours d'exécution. De tels systèmes rendent généralement les exigences ci-dessus faciles à satisfaire. Cependant, il est important de reconnaître que de nombreux systèmes natifs utilisent des procédures de liaison complexes (factorisation de section .linkonce et table de constructeur C++, par exemple) qui rendent les exigences difficiles à satisfaire. En général, on ne peut pas supposer qu'utiliser add-symbol-file pour lire les informations symboliques d'un fichier objet relogeable aura le même effet que de lier le fichier objet relogeable au programme de manière normale.

add-symbol-file ne se répète pas si vous appuyez sur après l’avoir utilisé.

Vous pouvez utiliser les options -mapped' and-readnow 'comme avec la commande symbol-file pour modifier la manière dont gdb gère les informations de la table des symboles pour le nom de fichier. 

15
alk

En plus de la réponse et des commentaires de alk, l'adresse demandée est l'adresse de la section .text . Vous pouvez la trouver à l'aide de la commande readelf

Ici vous avez un exemple d'utilisation de readelf pour les fichiers binaires L'adresse où le nom du fichier a été chargé est manquante [GDB]

8
Olivier

Au lieu d'essayer de charger manuellement des symboles à l'emplacement correct, j'ai trouvé plus pratique de fusionner les symboles avec les exécutables supprimés avec eu-unstrip, puis de reproduire le crash avec les symboles déjà présents.

Cette approche ne dépend pas des fichiers de symboles correspondant au schéma de dénomination requis par les mécanismes de résolution de chemin (debug link et build id) qui sont utilisés lorsque vous définissez debug-file-directory.

1
the8472
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...

voir http://www.delorie.com/gnu/docs/gdb/gdb_125.html

0
Frank Ren