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

如何在Bash脚本中使用GDB运行带有命令行参数的程序?,gdb,command-line-arguments,Gdb,Command Line Arguments,在GDB上运行程序时,程序的参数通常在run命令中给出。有没有一种方法可以使用GDB运行程序,并在shell脚本中提供参数 我在一个相关问题中看到了答案,提到我们可以在脚本开始执行后将GDB附加到程序。但接下来我将不得不“等待”节目 还有其他方法吗?您可以使用上下文创建一个文件: run arg1 arg2 arg3 etc program input 然后像这样调用gdb gdb prog < file gdb prog

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

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


还有其他方法吗?

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

run arg1 arg2 arg3 etc

program input
然后像这样调用gdb

gdb prog < file
gdb prog
您可以使用--args参数运行gdb

gdb --args executablename arg1 arg2 arg3
如果希望它自动运行,请在文件中放置一些命令(例如“run”),并将其作为参数:-x/tmp/cmds。您也可以选择以批处理模式运行

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

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

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

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
gdb有
--init command
其中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
注释放置一个断点,并在Hugo Ideler的回答之外启动它运行。 当使用具有自身前缀的参数时,如
--
-
,我不确定是否与gdb one冲突

gdb似乎将all after
args
选项作为程序的参数

首先,我想确认一下,我在运行gdb时在args周围加了引号,它在启动时就被删除了

这也可以,但可以选择:

gdb --args executablename "--arg1" "--arg2" "--arg3"
这不起作用:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
在这种情况下,
-tui
被用作我的程序参数,而不是gdb one。

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

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
gdb-ex“设置参数…”
您可以将此与向stdin输入文件和“立即运行”结合使用:

gdb-ex“设置参数…”<“-ex”r”

太晚了,但是这里有一个方法可以在
gdb
会话期间工作

gdb

然后

(gdb)恰当的参数

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

set args -- Set argument list to give program being debugged when it is started.
设置args arg1 arg2…

然后

r


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

Argg,
mangdb
不包含
--args
,这就是我没有找到它的原因<代码>gdb--help
有帮助。@CiroSantilli新疆改造中心法轮功六四事件 GDB是GNU。要查看GNU工具的完整文档,请记住下次使用
info-gdb
:-)。@Apteryx也许有一天我会学习
info
。如果Google或堆栈溢出停止工作XD@CiroSantilli新疆改造中心法轮功六四事件 在发现“I”键(
索引搜索
)后,我迷上了信息。尝试:
info-gdb
,然后是“i”,然后是“--args”。它会把你带到它。这可能是重复的,这正是OP希望避免的。嗯,是的,谢谢你,公平点。我不知道我怎么这么长时间没有注意到这一点。不过,我想我会把答案留在这里,因为iirc,当我在谷歌上搜索“如何使用gdb传递命令行参数”之类的内容时,我偶然发现了这个问题,发现答案不见了,我继续添加它,但没有意识到(将近一年!)“我的答案并没有解决眼前的问题。”KarateSnowMachine作为一个来自谷歌的人,这个答案更符合我的要求。也许我们应该把问题修改得更一般,因为它有这样一个一般性的标题,或者我们应该缩小标题。减少限制可能对更多的读者更有用。不知道
-exe=r
非常有用@雨果太棒了!非常感谢。有用!
gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
set args -- Set argument list to give program being debugged when it is started.