39 votes

Appelez gdb pour transmettre automatiquement des arguments au programme en cours de débogage

Je voudrais écrire un script (sous certaines conditions) exécute gdb et d'exécuter automatiquement un programme X avec un ensemble d'arguments Y. une Fois que le programme a fini de s'exécuter, l'utilisateur doit rester à gdb invite jusqu'à ce qu'il/elle explicitement sorties il.

Une façon de le faire serait d'avoir le script de sortie de la commande exécuter en plus des arguments Y à un fichier F et ensuite le script invoquer gdb comme ceci:

gdb X < F

Mais est-il un moyen de le faire sans l'introduction d'un fichier temporaire?

Merci.

87voto

Nathan Fellman Points 31310

La meilleure façon de faire cela, étant donné un programme X et liste des paramètres a b c:

X a b c

Est d'utiliser gdbs' --args option, comme suit:

gdb --args X a b c


gdb --help a ceci à dire à propos de --args:

--args Arguments after executable-file are passed to inferior

Ce qui signifie que le premier argument après l' --args est l'exécutable à déboguer, et tous les arguments qui suivent qui sont passés comme c'est pour que l'exécutable.

28voto

Adam Rosenfield Points 176408

Si vous souhaitez exécuter certaines commandes via GDB, puis le quitter ou l'exécuter complètement, faites simplement

 echo commands | gdb X
 

Si vous voulez le laisser à l'invite de commande après avoir exécuté ces commandes, vous pouvez faire

 (echo commands; cat) | gdb X
 

Cela se traduit par un écho des commandes dans GDB, puis vous tapez dans le processus cat , qui copie son stdin sur stdout, qui est redirigé vers GDB.

9voto

mike v Points 71

il y a l'option -x , par exemple

 gdb -x gdb_commands exe_file
 

où * gdb_commands * peut être par exemple (dans le cas d'un émulateur Android):

 target remote :5039
 

1voto

RandomNickName42 Points 3994
 gdb target -e "my-automation-commands"
 

my-automation-orders contenant tout ce que vous voudriez normalement exécuter,

 break 0x123
set args "foo" bar 2
r
 

Pas strictement un fichier temporaire, si vous avez quelques scripts d'initialisation standard;)

1voto

sdaau Points 6262

Eh bien, c'est juste un commentaire, pas vraiment une réponse, juste voulu inclure certains des extraits de code. Je suis sur bash/Ubuntu Lucid - et pour moi, j'ai eu à peu près les mêmes problèmes que dans: "GDB a des problèmes avec l'obtention de commandes canalisée vers STDIN - Unix Linux, Forum - Fixunix.com".

En gros, j'aimerais atteindre le même comme dans l'extrait suivant:

$ gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) pwd
Working directory /media/work/dir.
(gdb) 

... sauf que, je voudrais "pipe" l' pwd commande en quelque sorte, et de garder gdb ouvrir par la suite (comme dans l'exemple ci-dessus).

J'ai essayé quelques suggestions ici, et la seule chose à travailler pour moi, c'est l' (echo commands; cat) | gdb de la syntaxe ainsi que (un peu) Ici Chaînes - voici mes résultats:

$ echo "pwd" | gdb
(gdb) Hangup detected on fd 0
error detected on stdin


$ echo "pwd" | gdb -x /dev/stdin
GNU gdb (GDB) 7.1-ubuntu
...
/dev/stdin: Invalid argument.
(gdb) Hangup detected on fd 0
error detected on stdin


$ gdb -x <(echo "pwd")
GNU gdb (GDB) 7.1-ubuntu
...
/dev/fd/63: No such file or directory.
(gdb) q


$ gdb -e "pwd"
GNU gdb (GDB) 7.1-ubuntu
...
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) q   # nothing happens


$ gdb <<<"pwd"
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) quit    # OK, but autoexits


$ gdb <<<"pwd
> "
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) Working directory /media/work/dir.
(gdb) quit    # with a line break at end, it execs twice, then exits


# the only one OK for my needs - 
# except locks after quit, and needs Ctrl-C
$ (echo "pwd"; cat) | gdb 
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) q
^C 

Eh bien, espérons que cela aide quelqu'un,
Cheers!

 
Edit: Maintenant, je sais au moins pourquoi le processus de substitution ne fonctionne pas - il va utiliser un fichier temporaire descripteur, qui ne peut être reconnu comme un fichier en ls (donc gdb certainement ne peut pas le lire; en outre, la référence disparaît presque immédiatement, à moins que le processus est en quelque sorte bloqué, comme avec cat) - voir le terminal extrait de journal:

$ echo -e "***\n" <(echo "pwd") "\n***\n`cat <(ls -C /dev/fd ; echo; for ix in /dev/fd/*; do irl=$(readlink -f $ix); echo $ix -\> $irl; ls -la $ix 2>&1; ls -la $irl 2>&1; echo '______'; done ; ls -C /dev/fd )`"

***
 /dev/fd/63 
***
0  1  2  3  63

/dev/fd/0 -> /dev/pts/0
lrwx------ 1 user user 64 2010-11-07 21:18 /dev/fd/0 -> /dev/pts/0
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/1 -> /proc/10713/fd/pipe:[236191]
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/1 -> pipe:[236151]
ls: cannot access /proc/10713/fd/pipe:[236191]: No such file or directory
______
/dev/fd/2 -> /dev/pts/0
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/2 -> pipe:[236151]
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/255 -> /proc/10721/fd/255
ls: cannot access /dev/fd/255: No such file or directory
ls: cannot access /proc/10721/fd/255: No such file or directory
______
/dev/fd/3 -> /proc/10725/fd/3
ls: cannot access /dev/fd/3: No such file or directory
ls: cannot access /proc/10725/fd/3: No such file or directory
______
0  1  2  3

Aussi, les touches haut/bas ne parviennent pas à travailler avec des (echo commands; cat) | gdb, parce que c'est la façon dont le chat se comporte; si on se contente de courir cat donc il copie stdin vers la sortie standard, on obtient:

$ cat # or `cat -`: and start pressing up/down keys - and get:
^[[A^[[B^[[A^[[B^[[A^[[B^C

Vous pouvez essayer de tourner sur raw en mode caractère (ou désactiver le tampon/cuit mode) avec stty -cooked, puis cat permettra à la fois d'écrire des caractères comme ^[[A, et déplacer le curseur - malheureusement, dans ce mode, les touches Ctrl-C ne fonctionne plus, donc vous ne serez pas en mesure de fermer cat de cette façon...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X