web-dev-qa-db-fra.com

Comment exécuter un programme avec des arguments en ligne de commande utilisant gdb dans un script bash?

Lors de l'exécution d'un programme sur gdb, les arguments du programme sont généralement définis à la commande run. Existe-t-il un moyen d'exécuter le programme en utilisant gdb et de donner des arguments dans un script Shell? 

J'ai vu une réponse dans une question connexe, mentionnant que nous pouvons attacher le gdb au programme après l'exécution du script. Mais ensuite, je devrai attendre le programme.

Je suis curieux de savoir s'il existe un autre moyen de le faire.

304
drox

Vous pouvez exécuter gdb avec le paramètre --args,

gdb --args executablename arg1 arg2 arg3

Si vous souhaitez qu'il s'exécute automatiquement, placez des commandes dans un fichier (par exemple, 'run') et donnez-le sous forme d'argument: -x/tmp/cmds. Vous pouvez éventuellement exécuter le mode -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
432
Hugo Ideler
gdb -ex=r --args myprogram arg1 arg2

-ex=r est l'abréviation de -ex=run et indique à gdb d'exécuter votre programme immédiatement, plutôt que d'attendre que vous tapiez "run" à l'invite. Ensuite, --args indique que tout ce qui suit est la commande et les arguments, comme vous le feriez normalement à l'invite de la ligne de commande.

92
Hugo

Une autre façon de le faire, que je trouve personnellement un peu plus pratique et intuitive (sans avoir à mémoriser le paramètre --args), consiste à compiler normalement et à utiliser r arg1 arg2 arg3 directement à partir de gdb, comme suit:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
29
aspiring_sarge

Vous pouvez créer un fichier avec un contexte:

run arg1 arg2 arg3 etc

program input

Et appelez gdb comme

gdb prog < file
9
George Kastrinis

gdb a --init-command <somefile> où un fichier a une liste de commandes gdb à exécuter, je l’utilise pour avoir des commentaires //GDB dans mon code, puis `

echo "file ./a.out" > run
grep -nrIH "//GDB"|
    sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
    awk '{print "b" " " $1}'|
    grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r

en tant que script, qui charge la commande pour charger les symboles de débogage, puis génère une liste de commandes break pour définir un point d'arrêt pour chaque commentaire //GDB et le lance en cours d'exécution

1
Austin_Anderson

Un ajout à la réponse de Hugo Ideler . Lors de l'utilisation d'arguments ayant un préfixe lui-même comme -- ou -, je n'étais pas sûr d'entrer en conflit avec gdb.

Il semble que gdb prenne toutes les options après l'option args comme arguments du programme.

Au début, je voulais être sûr, j’ai exécuté gdb avec des guillemets autour de vos arguments, celui-ci est supprimé au lancement.

Cela fonctionne aussi, mais facultatif:

gdb --args executablename "--arg1" "--arg2" "--arg3"

Cela ne marche pas:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

Dans ce cas, -tui est utilisé comme paramètre de programme et non comme paramètre gdb.

1
Sandburg

Si le paramètre --args ne fonctionne pas sur votre machine (c'est-à-dire sous Solaris 8), vous pouvez lancer gdb comme suit:

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

Et vous pouvez combiner cela avec l'entrée d'un fichier sur stdin et "en cours d'exécution immédiatement":

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
0
Johannes