如何在bash脚本中使用gdb运行带命令行args的程序?

dro*_*rox 376 gdb command-line-arguments

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

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

我很好奇是否还有其他方法可以做到这一点.

Hug*_*ler 531

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

gdb --args executablename arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

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

gdb -batch -x /tmp/cmds --args executablename arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

  • Argg,`man gdb`不包含`--args`,这就是为什么我没找到它.`gdb --help`的确如此. (42认同)
  • @Apteryx 也许有一天我会学习“信息”。如果 Google 或 Stack Overflow 停止工作 XD (8认同)
  • @CiroSantilli新疆改造中心法轮功六四事件 GDB是GNU。要查看 GNU 工具的完整文档,请记住下次使用 `info gdb` :-)。 (5认同)
  • @CiroSantilli新疆改造中心法轮功六四事件 在发现“i”键(“索引搜索”)后,我对信息着迷了。尝试:“info gdb”,然后“i”,然后“--args”。它会带你正确地做到这一点。 (4认同)

小智 120

gdb -ex=r --args myprogram arg1 arg2
Run Code Online (Sandbox Code Playgroud)

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

  • 不知道 `-exe=r` 非常有用! (2认同)

asp*_*rge 41

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

$ gcc -g *.c *.h
$ gdb ./a.out
(gdb) r arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)

  • 这正是OP希望避免不得不做的事情. (17认同)
  • @KarateSnowMachine 作为来自谷歌的人,这个答案*更多*符合我正在寻找的内容。也许我们应该修改这个问题,使其更加笼统,因为它有一个如此笼统的标题,或者我们应该缩小标题。减少限制可能对更多读者更有用。 (6认同)
  • 嗯,是的,谢谢你,公平点.我不确定这是多久以来我的注意事项.我想我会在这里留下答案,但是,因为iirc,当我用谷歌搜索"如何使用gdb传递命令行参数",并找到答案缺失时,我偶然发现了这个问题,我继续添加它,没有意识到(差不多一年!)我的答案没有解决手头的问题. (4认同)

Geo*_*nis 16

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

run arg1 arg2 arg3 etc

program input
Run Code Online (Sandbox Code Playgroud)

并调用gdb之类的

gdb prog < file
Run Code Online (Sandbox Code Playgroud)


San*_*urg 7

除了Hugo Ideler的回答。当使用带有像--or 这样的前缀的参数时-,我不确定是否与 gdb 冲突。

看来 gdb 将所有 afterargs选项作为程序的参数。

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

这也有效,但可选:

gdb --args executablename "--arg1" "--arg2" "--arg3"
Run Code Online (Sandbox Code Playgroud)

这不起作用:

gdb --args executablename "--arg1" "--arg2" "--arg3" -tui
Run Code Online (Sandbox Code Playgroud)

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


Joh*_*nes 6

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

gdb -ex "set args <arg 1> <arg 2> ... <arg n>"
Run Code Online (Sandbox Code Playgroud)

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

gdb -ex "set args <arg 1> <arg 2> ... <arg n> < <input file>" -ex "r"
Run Code Online (Sandbox Code Playgroud)


ali*_*oar 6

太晚了,但这里有一种在gdb会话期间有效的方法。

gdb <executable>

然后

(gdb) apropos argument

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

set args -- Set argument list to give program being debugged when it is started.
Run Code Online (Sandbox Code Playgroud)

set args arg1 arg2 ...

然后

r

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