Comment charger le programme de lecture stdin et prendre des paramètres dans gdb?

101

J'ai un programme qui prend l'entrée de stdin et prend également quelques paramètres de la ligne de commande. Cela ressemble à ceci:

cat input.txt > myprogram -path "/home/user/work"

J'essaye de déboguer le code avec gdb dans emacs, par Mx gdb, j'essaye de charger le programme avec la commande:

gdb cat input.txt > myprogram -path "/home/user/work"

Cependant, gdb ne l'aime pas.

Question lit d'enfant d' ici . Malheureusement, je ne comprends pas la solution et je ne sais pas quoi faire au-delà de la compilation avec l' -goption et de l'exécution de la commande Mx gdb.

vinc456
la source

Réponses:

132

Si vous le faisiez à partir d'un shell, vous le feriez comme ceci:

% gdb myprogram
gdb> run params ... < input.txt

Cela semble également fonctionner dans emacs.

Alnitak
la source
La redirection semble fonctionner mais j'obtiens des erreurs. Impossible de lire une image de fichier objet valide à partir de la mémoire. Programme terminé avec le code 042. Des idées?
vinc456
C'est probablement une erreur GDB générale, et probablement rien à voir avec le fait que vous utilisez emacs. Apprenez d'abord à exécuter GDB à partir d'un shell (avec une nouvelle question si nécessaire), puis à vous soucier de l'exécuter dans emacs.
Alnitak
1
Je l'ai compris. Pour une raison quelconque, j'ai tapé void main (int argc, char * argv []) au lieu de "int main ..." et cela m'a glissé des yeux. Quoi qu'il en soit, tout fonctionne bien maintenant; Merci de votre aide!
vinc456
2
Un merci tardif - le manuel gdb est une douleur dans le cul à draguer.
Supprimé le
1
Sur Windows utilisant msys64, j'obtiens <et input.txtcomme argvarguments de mon programme: (Je vais continuer à creuser autour de ces réponses avec mon gdb 8.2.1: stackoverflow.com/questions/3544325/…
ixe013
32

Il existe plusieurs façons de procéder:

$ gdb myprogram
(gdb) r -path /home/user/work < input.txt

ou

$ gdb myprogram
(gdb) set args -path /home/user/work < input.txt
(gdb) r

ou

$ gdb -ex 'set args -path /home/user/work < input.txt' myprogram
(gdb) r

où la runcommande gdb ( r) utilise par défaut les arguments définis précédemment avec set args.

maxschlepzig
la source
4
Quand j'essaye ceci avec gdb dans cygwin, cela ne fonctionne pas. La commande "show args" montre que j'ai entré les arguments que je voulais, mais quand je lance le programme avec "r", le programme attend que je tape des trucs au lieu de lire à partir du fichier spécifié.
cardiff space man
1
@cardiffspaceman, eh bien, je ne peux pas le tester avec Cygwin - peut-être que leur version gdb est en quelque sorte limitée
maxschlepzig
Pourquoi pas simplement gdb -ex 'r -path /home/user/work < input.txt' myprogramdans la troisième variante?
Ruslan
@Ruslan, fonctionne aussi bien - l'utilisation de 'set args ...' vous donne simplement la possibilité de définir de manière interactive des points d'arrêt, etc. avant d'exécuter le programme
maxschlepzig
C'est vrai, mais vous pouvez également définir le point d'arrêt de manière non interactive, par exemple gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram.
Ruslan
6

Par souci d'exhaustivité au démarrage d'une session de débogage, il existe également l'option --args. c'est à dire)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
vinc456
la source
14
Comment redirigerais-tu input.txt en tant qu'entrée dans yourprog lors du démarrage d'une session de débogage comme celle-ci?
Peter Ajtai
1
@Peter:gdb --args yourprog.out input.txt
Ben Elgar
1
Cela ne fonctionne que si "yourprog" attend un nom de fichier pour spécifier l'entrée, pas la redirection d'entrée.
Alnitak
0

Et si vous n'avez pas besoin de déboguer depuis le tout début, vous pouvez également vous attacher à un processus déjà en cours d'exécution en utilisant:

$ gdb myprogram xxx

où xxx est l'identifiant du processus. Ensuite, vous n'avez pas besoin de dire à gdb les arguments de départ.

Zitrax
la source
4
Vous avez manqué de répondre au titre de la question, à la partie "lecture stdin". Je ferais un bon commentaire quelque part s'il était plus court.
Notinlist