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?
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.
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
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 utilisersolib-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.
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.
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é.