ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Bash 脚本中使用 GDB 运行带有命令行参数的程序?

在 GDB 上运行程序时,通常在 run 命令中给出程序的参数。有没有办法使用 GDB 运行程序并在 shell 脚本中提供参数?

我在一个相关问题中看到了一个答案,提到我们可以在脚本开始执行后将 GDB 附加到程序中。但随后我将不得不“等待”该程序。

还有另一种方法可以做到这一点吗?


H
Hugo Ideler

您可以使用 --args 参数运行 gdb:

gdb --args executablename arg1 arg2 arg3

如果您经常这样做(例如,从脚本运行 GDB 时),您可能需要考虑以下参数以进一步自动化操作。首先,您可以将 GDB 命令(例如“run”)放在一个文本文件中,并将文件名提供给 -x 参数。其次,您可以通过提供 --batch 参数在运行命令后退出 GDB。一个完整的例子:

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

Argg,man gdb 不包含 --args,这就是我没有找到它的原因。 gdb --help 确实如此。
@CiroSantilli新疆改造中心法轮功六事件 GDB是GNU。要查看 GNU 工具的完整文档,请记住下次使用 info gdb :-)。
@CiroSantilli新疆改造中心法轮功六事件我在发现'i'键(index-search)后迷上了信息。尝试:info gdb,然后是“i”,然后是“--args”。它会让你明白的。
@Apteryx 当我按“i”时,它显示“未找到索引”。在屏幕底部。
@WawrzyniecPruski 那是哪个 GNU/Linux 发行版?我怀疑他们的 GDB 软件包附带的信息手册有问题;使用 GNU Guix,您可以 guix shell gdb info-reader -- info gdb,然后 i RET --args 序列从那里开始工作。
M
Martijn Pieters
gdb -ex=r --args myprogram arg1 arg2

-ex=r-ex=run 的缩写,它告诉 gdb 立即运行您的程序,而不是等待您在提示符下键入“run”。然后 --args 表示后面的所有内容都是命令和参数,就像您通常在命令行提示符下键入它们一样。


不知道-exe=r很有用!
我明白了,你不能做 gdb --args -ex=r myprogram arg1 arg2
P
Peter Varo

另一种方法,我个人觉得更方便和直观(无需记住 --args 参数),是正常编译,并直接在 gdb 中使用 r arg1 arg2 arg3,如下所示:

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3

这正是 OP 希望避免做的事情。
嗯,是的,谢谢你,公平点。我不知道这是怎么让我这么长时间没有注意到的。我想我会在这里留下答案,但是,因为 iirc,当我用谷歌搜索“如何使用 gdb 传递命令行参数”之类的内容时,我偶然发现了这个问题,发现答案丢失了,我继续添加它,没有意识到(将近一年!)我的回答没有解决手头的问题。
@KarateSnowMachine 作为来自谷歌的人,这个答案更符合我正在寻找的内容。也许我们应该修改这个问题,使其更笼统,因为它有这样一个笼统的标题,或者我们应该缩小标题。减少限制可能对更多的读者更有用。
V
Vadim Kotov

您可以创建一个带有上下文的文件:

run arg1 arg2 arg3 etc

program input

并像调用 gdb

gdb prog < file

a
alinsoar

为时已晚,但这是一种在 gdb 会话期间有效的方法。

gdb <可执行文件>

然后

(gdb) apropos 论点

这将返回很多匹配项,有用的是 set args

set args -- Set argument list to give program being debugged when it is started.

设置参数 arg1 arg2 ...

然后

r

这将运行程序,将参数和参数计数传递给 main(argc, argv)。


J
Johannes

如果 --args 参数在您的机器上不起作用(即在 Solaris 8 上),您可以像这样启动 gdb

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"

您可以将其与将文件输入到标准输入并“立即运行”相结合:

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"

S
Sandburg

除了 Hugo Ideler 的回答。当使用具有自身前缀的参数(如 ---)时,我不确定是否与 gdb 冲突。

似乎 gdb 将所有 after args 选项作为程序的参数。

起初我想确定,我在你的参数周围加上引号的 gdb 运行,它在启动时被删除。

这也有效,但可选:

gdb --args executablename "--arg1" "--arg2" "--arg3"

这不起作用:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui

在这种情况下,-tui 用作我的程序参数而不是 gdb 参数。


A
Austin_Anderson

gdb 有 --init-command <somefile>,其中 somefile 有要运行的 gdb 命令列表,我使用它在我的代码中添加 //GDB 注释,然后 `

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

作为一个脚本,它放置加载调试符号的命令,然后生成一个中断命令列表,为每个 //GDB 注释放置一个断点,并开始运行


g
galian

如果你想从文件中传递参数,例如文件中的 scanf 作为输入

尝试这个

(gdb) run < the_file_contains_data