web-dev-qa-db-fra.com

Comment ajouter un répertoire au chemin de la bibliothèque lors du chargement d'un fichier core dans gdb sous Linux

J'ai un fichier de base généré sur un système distant auquel je n'ai pas d'accès direct. J'ai également des copies locales des fichiers de bibliothèque du système distant et le fichier exécutable du programme bloquant.

Je voudrais analyser ce dump de noyau dans gdb.

Par exemple:

gdb path/to/executable path/to/corefile

Mes bibliothèques sont dans le répertoire actuel.

Dans le passé, j'ai vu des débogueurs implémenter cela en fournissant l'option "-p". ou "-p/=."; alors ma question est:

Comment puis-je spécifier que les bibliothèques doivent d'abord être chargées à partir de chemins relatifs à mon répertoire actuel lors de l'analyse d'un fichier core dans gdb?

25
Mike Tunnicliffe

Lancez gdb sans spécifier l'exécutable ni le fichier core, puis tapez les commandes suivantes:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

Vous devrez vous assurer de mettre en miroir votre chemin de bibliothèque exactement à partir du système cible. Ce qui précède est destiné aux cibles de débogage qui ne correspondent pas à votre hôte. C'est pourquoi il est important de répliquer la structure de votre système de fichiers racine contenant vos bibliothèques.

Si vous déboguez à distance un serveur de même architecture et version Linux/glibc que votre hôte, vous pouvez procéder comme suit: fd suggéré:

set solib-search-path <path>

Si vous essayez de remplacer certaines bibliothèques, mais pas toutes, vous pouvez copier la structure de répertoires de la bibliothèque cible dans un emplacement temporaire et utiliser la solution solib-absolute-prefix décrite ci-dessus.

40
Drew Frezell

Je ne suis pas sûr que ce soit possible dans gdb, mais je ne suis pas un expert.

Cependant, je peux commenter sur l'éditeur de liens Linux dynamic. Les éléments suivants doivent afficher le chemin de toutes les bibliothèques partagées résolues et non résolues.

ldd path/to/executable

Nous devons savoir comment vos bibliothèques partagées ont été liées à votre exécutable. Pour ce faire, utilisez la commande suivante:

readelf -d path/to/executable | grep RPATH
  • Si la commande n'imprime rien, l'éditeur de liens dynamique utilisera des emplacements standard plus la variable d'environnement LD_LIBRARY_PATH pour rechercher les bibliothèques partagées.

  • Si la commande affiche certaines lignes, l’éditeur de liens dynamique ignorera LD_LIBRARY_PATH et utilisera à la place les rpath codés en dur.

    Si les rpaths répertoriés sont absolus, la seule solution que je connaisse consiste à copier (ou à établir un lien symbolique) vos bibliothèques vers les emplacements répertoriés.

    Si les rpath répertoriés sont relatifs, ils contiendront une $ Origin qui sera remplacée au moment de l’exécution par le chemin de l’exécutable. Déplacez l'exécutable ou les bibliothèques pour faire correspondre.

Pour plus d'informations, vous pouvez commencer par:

man ld.so
4
bltxd

J'ai trouvé cet extrait sur developer.Apple.com

set solib-search-path path

Si cette variable est définie, path est une liste de répertoires Séparés par deux-points dans laquelle Rechercher des bibliothèques partagées. solib-search-path' is used after solib-absolute-prefix 'ne réussit pas à la bibliothèque, ou si le chemin d'accès à la bibliothèque est relatif au lieu de absolu. Si vous souhaitez utiliser solib-search-path' instead of solib-absolute-prefix ', assurez-vous de Définir' solib-absolute-prefix 'sur un répertoire non existant Pour empêcher GDB . de trouver les bibliothèques de votre hôte.

EDIT:

Je ne pense pas que l’utilisation du paramètre ci-dessus ajoute des préfixes aux répertoires que j’ai ajoutés, mais cela semble les ajouter, donc les fichiers manquants dans mon système actuel sont récupérés dans les chemins que j’ai ajoutés. Je suppose que fixer le préfixe absolu-solib à quelque chose de faux et ajouter des répertoires dans le chemin-recherche-solib dans l'ordre dont j'ai besoin pourrait être une solution complète.

3
Mike Tunnicliffe

Vous pouvez également simplement définir LD_PRELOAD sur chacune des bibliothèques ou LD_LIBRARY_PATH sur le répertoire en cours lors de l'appel de gdb. Cela ne posera des problèmes que si gdb essaie d'utiliser l'une des bibliothèques préchargées.

2
Joseph Garvin

Une note importante:

si vous faites une compilation croisée et essayez de déboguer avec gdb, alors après avoir terminé 
file ECECUTABLE_NAME si vous voyez qch comme :

Using Host libthread_db library "/lib/libthread_db.so.1"

puis vérifiez si vous avez libthread_db pour votre système cible. J'ai trouvé beaucoup de problèmes similaires sur le web. Un tel problème ne peut pas être résolu en utilisant simplement "set solib-", vous devez aussi construire libthread_db en utilisant votre compilateur croisé.

0
psihodelia