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


428

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

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

还有另一种方法吗?


Answers:


612

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

gdb --args executablename arg1 arg2 arg3

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

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

53
Argg,man gdb不包含--args,这就是为什么我找不到它。gdb --help做。
西罗Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件GDB是GNU。要查看GNU工具的完整文档,请记住info gdb下次使用:-)。
Apteryx

1
@Apteryx也许有一天我会学习info。如果Google或Stack Overflow停止运行XD
Ciro Santilli郝海东冠状病六四事件法轮功

1
@CiroSantilli新疆改造中心法轮功六四事件我发现'i'键(index-search)后迷上了信息。试试:info gdb,然后是“ i”,然后是“ --args”。它会带您正确使用它。
Apteryx

138
gdb -ex=r --args myprogram arg1 arg2

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


不知道-exe=r非常有用!
杰夫

46

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

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

23
这正是OP希望避免的事情。
KarateSnowMachine '16

6
嗯,是的,谢谢。我不确定这么长时间逃脱了我的注意。我想我将答案留在这里,但是,因为iirc,当我在Google搜索“如何使用gdb传递命令行参数”之类的东西时偶然发现了这个问题,并找到了答案,我继续添加它,却没有意识到(将近一年!)我的回答没有解决眼前的问题。
aspiring_sarge

2
@KarateSnowMachine也是从Google来的人,这个答案符合我的需求。也许我们应该将问题修改为更笼统,因为它具有这样的一般标题,或者我们应该缩小标题的范围。减少限制可能会对更多的读者有用。
jpmc26 '19


4

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注释放置一个断点,并开始运行


4

如果该--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"

2

除了雨果·伊德勒的答案。当使用带有前缀如--或的参数时-,我不确定是否与gdb冲突。

似乎gdb花费了所有时间 args选项作为该程序的参数。

起初,我想确定的是,我在您的args周围加了引号,然后在启动时将其删除。

这也可以,但是可选:

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

这不起作用:

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

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


1

太晚了,但这是在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)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.