120

I have a program that takes input from stdin and also takes some parameters from command line. It looks like this:

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

I try to debug the code with gdb inside emacs, by M-x gdb, I try to load the program with the command:

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

However, gdb does not like it.

Question cribbed from here. Unfortunately I don't understand the solution and am not sure what to do beyond compiling with the -g option and running the command M-x gdb.

Benjamin W.
  • 46,058
  • 19
  • 106
  • 116
vinc456
  • 2,862
  • 5
  • 23
  • 30

6 Answers6

155

If you were doing it from a shell you'd do it like this:

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

This seems to work within emacs too.

Alnitak
  • 334,560
  • 70
  • 407
  • 495
  • The redirection seems to work but I get some errors. Failed to read a valid object file image from memory. Program exited with code 042. Any ideas? – vinc456 Jan 18 '09 at 18:04
  • That's likely a general GDB error, and probably nothing to do with the fact you're running within emacs. Learn how to run GDB from a shell first (with a new question if necessary), and then worry about running it inside emacs. – Alnitak Jan 18 '09 at 18:46
  • 1
    I figured it out. For some reason I typed void main(int argc, char *argv[]) instead of "int main..." and it slipped my eye. Anyways everything works fine now; thanks for your help! – vinc456 Jan 18 '09 at 19:04
  • 2
    A belated thank you - the gdb manual is a pain in the butt to dredge through. – Deleted Sep 04 '11 at 15:20
  • 1
    On Windows using msys64 I get `<` and `input.txt` as `argv` arguments to my program :( I'll keep digging around these answers with my gdb 8.2.1 : https://stackoverflow.com/questions/3544325/input-redirection-in-gdb-mingw – ixe013 Oct 17 '19 at 17:20
  • 1
    It's not working. I invoked GDB with `gdb a.out` and run by `r arg1 < input.txt`, but it recognized `arg1`, `<` and `input.txt` as three arguments. **It turns out that `set startup-with-shell off` is the culprit!** – davidhcefx Aug 24 '23 at 10:00
36

There are several ways to do it:

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

or

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

or

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

where the gdb run command (r) uses by default the arguments as set previously with set args.

maxschlepzig
  • 35,645
  • 14
  • 145
  • 182
  • 4
    When I try this with gdb in cygwin, it doesn't work. The "show args" command shows that I entered the args I wanted, but when I start the program with "r", the program waits until I type stuff instead of reading from the specified file. – cardiff space man Mar 14 '12 at 23:36
  • 1
    @cardiffspaceman, well, I can't test it with Cygwin - perhaps their gdb version is somehow limited – maxschlepzig Mar 15 '12 at 09:57
  • Why not simply `gdb -ex 'r -path /home/user/work < input.txt' myprogram` in the third variant? – Ruslan Apr 17 '16 at 06:50
  • @Ruslan, works as well - using 'set args ...' just gives you the chance to interactively define some break points etc. before running the program – maxschlepzig Apr 17 '16 at 07:32
  • True, but you can also set the breakpoint non-interactively, e.g. `gdb -ex 'b main' -ex 'r -path /home/user/work < input.txt' myprogram`. – Ruslan Apr 17 '16 at 09:37
  • @Ruslan, sure, nobody implied that you cannot do that. Sometimes you want to do it interactively. Sometimes you don't. I think the answer contains enough examples such that this is all pretty obvious. – maxschlepzig Apr 17 '16 at 11:16
7

This is eleven years later, and this question has an answer already, but for someone just like me in the future, I just wanted to add some thing.

After you run gdb your_program, if you just type run < file_containing_input, the program will just run till the end, and you might not catch the problem, so before you do run < file_containing_input do a break. Something like this

$ gdb your_program
gdb> break main
gdb> run < file_containing_input
EHM
  • 877
  • 1
  • 7
  • 28
6

For completeness' sake upon starting a debugging session there is also the --args option. ie)

gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
Ken Bloom
  • 57,498
  • 14
  • 111
  • 168
vinc456
  • 2,862
  • 5
  • 23
  • 30
1

And if you do not need to debug from the very beginning you can also attach to an already running process by using:

$ gdb myprogram xxx

where xxx is the process id. Then you do not need to tell gdb the starting arguments.

Zitrax
  • 19,036
  • 20
  • 88
  • 110
  • 4
    You missed to answer to the question title, at the part "reading stdin". I would make a good comment somewhere if it were shorter. – Notinlist Dec 21 '11 at 15:00
0

This is a really old questions, but I want to point to the technique with mkfifo as described here:

gdb - debugging with pipe

if you have a more complicated pipe than reading from just one file, such as:

cat jonesforth.f examples/defining-words.f - |./jonesforth

the mkfifo can be very convenient.