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

时间:2011-05-25 07:42:01

标签: gdb command-line-arguments

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

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

还有其他办法吗?

9 个答案:

答案 0 :(得分:460)

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

gdb --args executablename arg1 arg2 arg3

如果您希望它自动运行,请将一些命令放在一个文件中(例如'run')并将其作为参数:-x / tmp / cmds。您可以选择使用-batch模式运行。

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3

答案 1 :(得分:100)

gdb -ex=r --args myprogram arg1 arg2

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

答案 2 :(得分:30)

另一种方法,我个人认为稍微更方便和直观(无需记住--args参数),是正常编译,并直接从{{1}使用r arg1 arg2 arg3像这样:

gdb

答案 3 :(得分:11)

您可以使用上下文创建一个文件:

run arg1 arg2 arg3 etc

program input

并调用gdb,如

gdb prog < file

答案 4 :(得分:2)

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

gdb <executable>

然后

(gdb) apropos argument

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

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

set args arg1 arg2 ...

然后

r

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

Hugo Ideler答案的补充。 当使用具有自己前缀的参数如---时,我不确定是否与gdb冲突。

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

起初我想确定,我在你的args周围用引号运行gdb,它在发布时被移除。

这也有效,但可选:

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

这不起作用:

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

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

答案 7 :(得分:1)

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

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

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

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

答案 8 :(得分:-4)

您可以安装和运行Eclipse,并在这个世纪和几千年的环境中进行工作/调试。