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.
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
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.
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
Vous pouvez créer un fichier avec un contexte:
run arg1 arg2 arg3 etc
program input
Et appelez gdb comme
gdb prog < file
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
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.
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"