ChatGPT解决这个技术问题 Extra ChatGPT

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?


H
Hugo Ideler

You can run gdb with --args parameter:

gdb --args executablename arg1 arg2 arg3

If you are doing this often (e.g. when running GDB from a script), you might want to consider the following arguments to automate things further. First, you can place your GDB commands (such as 'run') in a text file and provide the filename to the -x argument. Second, you can have GDB exit after running your commands by providing the --batch argument. A full example:

gdb -x commands.txt --batch --args executablename arg1 arg2 arg3

Argg, man gdb does not contain --args, that's why I did not find it. gdb --help does.
@CiroSantilli新疆改造中心法轮功六四事件 GDB is GNU. To view the full documentation of GNU tools, remember to use info gdb next time :-).
@CiroSantilli新疆改造中心法轮功六四事件 I got hooked to info after discovering the 'i' key (index-search). Try: info gdb, then 'i', then '--args'. It'll bring you right to it.
@Apteryx When I press 'i' it shows "No indices found." at the bottom of the screen.
@WawrzyniecPruski on which GNU/Linux distribution is that? I suspect something's wrong with the info manual shipped with their GDB package; using GNU Guix, you can guix shell gdb info-reader -- info gdb, and the i RET --args sequence works from there.
M
Martijn Pieters
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.


Didn't know about the -exe=r very useful!
I see, you can't do gdb --args -ex=r myprogram arg1 arg2.
P
Peter Varo

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

This is exactly what the OP is hoping to avoid having to do.
Hmmm, yes, thank you, fair point. I'm not sure how that's escaped my notice for so long. I think I'll leave the answer here, however, because iirc, I stumbled upon this question when I'd googled something like "How to pass command line arguments using gdb", and finding the answer missing, I went on to add it, without realizing (for almost a year!) that my answer didn't address the question at hand.
@KarateSnowMachine As someone arriving from Google as well, this answer is more along the lines of what I was looking for. Perhaps we should revise the question to be more general since it has such a general title, or maybe we should narrow the title. Making it less restrictive would probably be more useful to the greater number of readers.
V
Vadim Kotov

You could create a file with context:

run arg1 arg2 arg3 etc

program input

And call gdb like

gdb prog < file

a
alinsoar

Much too late, but here is a method that works during gdb session.

gdb

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.


J
Johannes

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"

S
Sandburg

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.


A
Austin_Anderson

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


g
galian

If you want to pass arguments from file, e.g. scanf from a file as input

try this

(gdb) run < the_file_contains_data