web-dev-qa-db-fra.com

Comment utiliser gdb avec LD_PRELOAD

J'exécute un programme avec LD_PRELOADing une bibliothèque spécifique. Comme ça.

LD_PRELOAD=./my.so ./my_program

Comment exécuter ce programme avec gdb?

50
MetallicPriest

Procédez comme suit.

gdb your_program

(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
59
MetallicPriest

Publication car nous avons rencontré un cas où set environment n'a pas fonctionné:

De documentation GDB :

set exec-wrapper wrapper
show exec-wrapper
unset exec-wrapper

Lorsque ‘exec-wrapper’ est défini, le wrapper spécifié est utilisé pour lancer des programmes de débogage. gdb démarre votre programme avec une commande Shell du programme wrapper form exec. Les guillemets sont ajoutés au programme et à ses arguments, mais pas au wrapper, vous devez donc ajouter des guillemets si cela convient à votre Shell. L'encapsuleur s'exécute jusqu'à ce qu'il exécute votre programme, puis gdb prend le contrôle.

Vous pouvez utiliser n'importe quel programme qui appelle éventuellement execve avec ses arguments comme wrapper. Plusieurs utilitaires Unix standard le font, par exemple env et Nohup. Tout script Unix Shell se terminant par exec "$ @" fonctionnera également.

Par exemple, vous pouvez utiliser env pour passer une variable d'environnement au programme débogué, sans définir la variable dans l'environnement de votre Shell :

         (gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so'
         (gdb) run
12
Alexey Romanov

Voici un moyen de tout exécuter (avec arguments et environnement) en une seule commande:

Exemple:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l

L'observateur averti remarquera que env sert ici de wrapper exec (comme la réponse d'Alexey Romanov).

8
user2394284

Vous pouvez fournir env en tant qu'exécutable sur la ligne de commande à l'aide de -iex drapeau:

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
6
ecatmur

Vous pouvez le faire de la même manière, ajoutez simplement gdb avant le nom du programme:

LD_PRELOAD=./my.so gdb ./my.program

Vous pouvez vérifier les variables d'environnement en utilisant:

(gdb) show environment LD_PRELOAD

Dans les rares cas, vous devez réellement le changer dans gdb, par exemple lors du débogage d'une dlopen(), vous pouvez le faire:

(gdb) set environment LD_PRELOAD ./my.so

Oh, attendez, cela ne fonctionne pas pour moi avec gdb 7.6.2! La bibliothèque n'est pas chargée, ce qui signifie qu'aucune des réponses ici n'est entièrement correcte, du moins avec les outils actuels.

0
Pavel Šimerda