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

429

Lors de l'exécution d'un programme sur GDB, généralement, les arguments du programme sont donnés à la runcommande. Existe-t-il un moyen d'exécuter le programme à l'aide de GDB et de fournir des arguments dans un script shell?

J'ai vu une réponse dans une question connexe, mentionnant que nous pouvons attacher GDB au programme après que le script commence à s'exécuter. Mais alors je devrai «attendre» le programme.

Y a-t-il une autre façon de procéder?

drox
la source
2
doublon possible de Comment passer des arguments et rediriger stdin d'un fichier vers un programme exécuté en gdb?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

613

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

gdb --args executablename arg1 arg2 arg3

Si vous voulez qu'il s'exécute automatiquement, placez quelques commandes dans un fichier (par exemple 'run') et donnez-le comme argument: -x / tmp / cmds. En option, vous pouvez exécuter le mode -batch.

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Hugo Ideler
la source
53
Argg, man gdbne contient pas --args, c'est pourquoi je ne l'ai pas trouvé. gdb --helpEst-ce que.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 GDB est GNU. Pour afficher la documentation complète des outils GNU, n'oubliez pas d'utiliser la info gdbprochaine fois :-).
Apteryx
1
@Apteryx peut-être qu'un jour j'apprendrai info. Si Google ou Stack Overflow cesse de fonctionner XD
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Je suis devenu accro à l'information après avoir découvert la touche 'i' ( index-search). Essayez info gdb:, puis «i», puis «--args». Cela vous y amènera.
Apteryx
140
gdb -ex=r --args myprogram arg1 arg2

-ex=rest l'abréviation de -ex=rungdb et indique à gdb d'exécuter votre programme immédiatement, plutôt que d'attendre que vous tapiez "run" à l'invite. Dit ensuite --argsque tout ce qui suit est la commande et les arguments, tout comme vous les taperiez normalement à l'invite de ligne de commande.

Hugo
la source
Je ne savais pas -exe=rtrès utile!
Jeef
46

Une autre façon de le faire, que je trouve personnellement un peu plus pratique et intuitive (sans avoir à se souvenir du --argsparamètre), est de compiler normalement et d'utiliser r arg1 arg2 arg3directement de l'intérieur gdb, comme ceci:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
aspiring_sarge
la source
23
C'est exactement ce que le PO espère éviter d'avoir à faire.
KarateSnowMachine
6
Hmmm, oui, merci, juste point. Je ne sais pas comment cela a échappé à mon attention pendant si longtemps. Je pense que je vais laisser la réponse ici, cependant, parce que iirc, je suis tombé sur cette question lorsque j'avais googlé quelque chose comme "Comment passer des arguments de ligne de commande en utilisant gdb", et en trouvant la réponse manquante, j'ai continué à l'ajouter , sans réaliser (pendant près d'un an!) que ma réponse ne répondait pas à la question posée.
aspiring_sarge
2
@KarateSnowMachine En tant que personne arrivant de Google également, cette réponse est plus dans le sens de ce que je cherchais. Peut-être devrions-nous réviser la question pour qu'elle soit plus générale car elle a un titre aussi général, ou peut-être devrions-nous restreindre le titre. Le rendre moins restrictif serait probablement plus utile au plus grand nombre de lecteurs.
jpmc26
18

Vous pouvez créer un fichier avec le contexte:

run arg1 arg2 arg3 etc

program input

Et appelez gdb comme

gdb prog < file
George Kastrinis
la source
4

gdb a --init-command <somefile>où somefile a une liste de commandes gdb à exécuter, je l'utilise pour avoir des //GDBcommentaires 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

comme un script, qui place la commande pour charger les symboles de débogage, puis génère une liste de commandes d'arrêt pour mettre un point d'arrêt pour chaque //GDBcommentaire, et le démarre en cours d'exécution

Austin_Anderson
la source
4

Si le --argsparamètre ne fonctionne pas sur votre machine (c'est-à-dire sur Solaris 8), vous pouvez démarrer gdb comme

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

Et vous pouvez combiner cela avec la saisie d'un fichier dans stdin et "l'exécution immédiate":

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

En plus de la réponse d'Hugo Ideler. Lors de l'utilisation d'arguments ayant eux-mêmes le préfixe comme --ou -, je n'étais pas sûr d'entrer en conflit avec gdb one.

Il semble que gdb prenne toutes les argsoptions after comme arguments pour le programme.

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

Cela fonctionne aussi, mais en option:

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

Cela ne fonctionne pas:

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

Dans ce cas, -tuiest utilisé comme paramètre de mon programme et non comme gdb one.

Sandburg
la source
1

Beaucoup trop tard, mais voici une méthode qui fonctionne pendant la gdbsession.

gdb <executable>

puis

(gdb) apropos argument

Cela retournera beaucoup de correspondances, l'utile est set args.

set args -- Set argument list to give program being debugged when it is started.

set args arg1 arg2 ...

puis

r

Cela exécutera le programme, en passant à main (argc, argv) les arguments et le nombre d'arguments.

alinsoar
la source