Invoquer gdb pour transmettre automatiquement les arguments au programme en cours de débogage

j'aimerais écrire un script qui (sous certaines conditions) exécutera gdb et exécutera automatiquement un programme X avec un ensemble D'arguments Y. Une fois que le programme a terminé l'exécution, l'utilisateur doit rester à l'invite de gdb jusqu'à ce qu'il/elle la quitte explicitement.

une façon de faire cela serait d'avoir le script sortie la commande run plus les arguments Y Vers un certain fichier F et ensuite le script invoquer gdb comme ceci:

gdb X < F

mais est y a-t-il un moyen de le faire sans introduire un dossier temporaire?

Merci.

38
demandé sur Nathan Fellman 2008-11-26 23:54:52

8 réponses

si vous voulez exécuter certaines commandes à travers GDB et ensuite le faire sortir ou exécuter jusqu'à la fin, il suffit de faire

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 fait écho aux commandes de GDB, puis vous tapez dans le processus cat , qui copie son stdin à stdout, qui est pipé dans GDB.

26
répondu Adam Rosenfield 2008-11-26 20:59:55

la façon la plus facile de le faire étant donné un programme X et la liste des paramètres a b c :

X a b c

doit utiliser gdb 's --args option, comme suit:

gdb --args X a b c

gdb --help a ceci à dire sur --args :

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

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

85
répondu Nathan Fellman 2009-01-25 19:34:34

il y a l'option - x , p.ex.

gdb -x gdb_commands exe_file

gdb_commands peut être par exemple (dans le cas de l'émulateur android):

target remote :5039
8
répondu mike v 2010-04-27 00:39:08

Après avoir essayé toutes les réponses ici,

  1. le hack echo/cat, bien qu'intelligent, casse pas mal de traits importants de gdb. Plus particulièrement, toutes les instructions utilisateur sont répondues automatiquement (de sorte que vous n'avez pas une chance de confirmer des opérations potentiellement dangereuses), et Ctrl+C (pour arrêter un processus que vous déboguez) finit par tuer cat, de sorte que vous ne pouvez pas réellement parler à gdb après cela.
  2. l'option-x est censée marcher, mais je n'ai pas pu le faire fonctionner avec ma version de gdb, et il nécessite un fichier temporaire.

Cependant, il s'avère que vous pouvez simplement utiliser -ex, comme ceci:

gdb -ex "target remote localhost:1234"

, Vous pouvez également spécifier ex plusieurs fois pour exécuter plusieurs commandes!

5
répondu crazy2be 2015-05-14 16:39:55

Eh bien, ce n'est qu'un commentaire, pas vraiment une réponse - je voulais juste inclure quelques extraits de code. Je suis sur bash / Ubuntu lucide - et pour moi, j'ai eu à peu près les mêmes problèmes que dans: " GDB a des problèmes avec obtenir des commandes acheminées à STDIN-Unix Linux Forum - Fixunix.com ".

en gros, je voudrais obtenir le même que 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 j'aimerais "Piper" Commande pwd d'une façon ou d'une autre, et garder gdb ouvert par la suite (comme dans l'exemple ci-dessus).

j'ai essayé quelques-unes des suggestions ici, et la seule chose qui fonctionne pour moi est la syntaxe (echo commands; cat) | gdb - ainsi que (un peu de travail) ici cordes - 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,

Acclamations!



Modifier: maintenant à le moins que je sache pourquoi la substitution de processus ne fonctionnera pas - il utilisera un descripteur de fichier temporaire, qui ne peut pas être reconnu comme un fichier par ls ( donc gdb ne peut certainement 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 1519360920") - voir l'extrait de journal de terminal:

$ 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 fonctionnent pas avec (echo commands; cat) | gdb , parce que c'est ainsi cat se comporte; si nous exécutons simplement cat pour qu'il copie stdin à stdout, nous obtenons:

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

vous pouvez essayer d'activer le mode caractère brut ( ou désactiver le mode tamponné/cuit ) avec stty -cooked , puis cat écrira les caractères comme ^[[A , et déplacera le curseur - malheureusement, dans ce mode, Ctrl-C ne fonctionne plus, de sorte que vous ne serez pas en mesure de fermer cat de cette façon...

1
répondu sdaau 2010-11-07 21:22:34
gdb target -e "my-automation-commands"

mon-automatisation-les commandes contenant tout ce que vous voulez normalement, le

break 0x123
set args "foo" bar 2
r

Pas strictement un fichier temp, si vous avez un peu de la norme scripts d'initialisation ;)

1
répondu RandomNickName42 2011-11-11 19:56:11

avec bash vous pouvez créer un script qui donne à l'utilisateur une entrée semblable à celle de n'importe quel exécutable que vous exécutez:

#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
1
répondu selalerer 2012-05-31 09:02:13

cat F | gdb X doit être identique. Ainsi, vous pouvez utiliser tout ce qui produit une sortie et un tuyau dans gdb au lieu de la commande cat ici.

je suppose que vous avez raison et gdb lit de stdin.

0
répondu Nathan Fellman 2009-11-02 09:52:18