Reputation: 2880
Question cribbed from here:
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.
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.
Upvotes: 123
Views: 99663
Reputation: 13159
char *argv[]
In bash:
$> ./myprogram -path "/home/user/work"
In gdb:
(gdb) run -path "/home/user/work"
In bash:
$> cat ./input.txt | ./program
In gdb:
(gdb) run < ./input.txt
In bash:
$> python -c 'print("input")' | ./myprogram
In gdb:
(gdb) run < <(python -c 'print("input")')
With the bash process substitution <(cmd) trick.
In gdb:
(gdb) run < <(python -c 'print("readline1")'; python -c 'print("readline2")')
Source: https://www.labri.fr/perso/fleury/posts/security/payload-injection.html
Upvotes: 0
Reputation: 689
I want to point to the technique with mkfifo as described here:
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.
Upvotes: 0
Reputation: 959
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
Upvotes: 7
Reputation: 39027
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
.
Upvotes: 35
Reputation: 2880
For completeness' sake upon starting a debugging session there is also the --args option. ie)
gdb gdbarg1 gdbarg2 --args yourprog arg1 arg2 -x arg3
Upvotes: 5
Reputation: 20246
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.
Upvotes: 1
Reputation: 339776
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.
Upvotes: 158