'How do I run a program with commandline arguments using GDB within a Bash script?
When running a program on GDB, usually, the arguments for the program are given at the run command. Is there a way to run the program using GDB and as well as give arguments within a shell script?
I saw an answer in a related question, mentioning that we can attach GDB to the program after the script starts executing. But then I will have to 'wait' the program.
Is there another way to do this?
Solution 1:[1]
gdb -ex=r --args myprogram arg1 arg2
-ex=r is short for -ex=run and tells gdb to run your program immediately, rather than wait for you to type "run" at the prompt. Then --args says that everything that follows is the command and arguments, just as you'd normally type them at the commandline prompt.
Solution 2:[2]
Another way to do this, which I personally find slightly more convenient and intuitive (without having to remember the --args parameter), is to compile normally, and use r arg1 arg2 arg3 directly from within gdb, like so:
$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
Solution 3:[3]
You could create a file with context:
run arg1 arg2 arg3 etc
program input
And call gdb like
gdb prog < file
Solution 4:[4]
Much too late, but here is a method that works during gdb session.
gdb <executable>
then
(gdb) apropos argument
This will return lots of matches, the useful one is set args.
set args -- Set argument list to give program being debugged when it is started.
set args arg1 arg2 ...
then
r
This will run the program, passing to main(argc, argv) the arguments and the argument count.
Solution 5:[5]
If the --args parameter is not working on your machine (i.e. on Solaris 8), you may start gdb like
gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
And you can combine this with inputting a file to stdin and "running immediatelly":
gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
Solution 6:[6]
In addition to the answer of Hugo Ideler.
When using arguments having themself prefix like -- or -, I was not sure to conflict with gdb one.
It seems gdb takes all after args option as arguments for the program.
At first I wanted to be sure, I ran gdb with quotes around your args, it is removed at launch.
This works too, but optional:
gdb --args executablename "--arg1" "--arg2" "--arg3"
This doesn't work :
gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
In that case, -tui is used as my program parameter not as gdb one.
Solution 7:[7]
gdb has --init-command <somefile> where somefile has a list of gdb commands to run, I use this to have //GDB comments in my code, then `
echo "file ./a.out" > run
grep -nrIH "//GDB"|
sed "s/\(^[^:]\+:[^:]\+\):.*$/\1/g" |
awk '{print "b" " " $1}'|
grep -v $(echo $0|sed "s/.*\///g") >> run
gdb --init-command ./run -ex=r
as a script, which puts the command to load the debug symbols, and then generates a list of break commands to put a break point for each //GDB comment, and starts it running
Solution 8:[8]
If you want to pass arguments from file,
e.g. scanf from a file as input
try this
(gdb) run < the_file_contains_data
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Martijn Pieters |
| Solution 2 | Peter Varo |
| Solution 3 | Vadim Kotov |
| Solution 4 | alinsoar |
| Solution 5 | Johannes |
| Solution 6 | |
| Solution 7 | Austin_Anderson |
| Solution 8 | galian |
