如何传递参数并将stdin从文件重定向到程序在gdb中运行?

209 c++ debugging gdb

我经常运行一个程序:

./a.out arg1 arg2 <file
Run Code Online (Sandbox Code Playgroud)

我想用gdb调试它.

我知道set args功能,但只能从gdb提示符.

rub*_*nvb 410

你可以这样做:

gdb --args path/to/executable -every -arg you can=think < of
Run Code Online (Sandbox Code Playgroud)

神奇的是--args.

只需输入rungdb命令控制台即可开始调试.

  • 起初我以为我读错了; 奇怪--args在可执行文件之前.但它确实如此! (24认同)
  • 我猜它是因为传统上`argv [0]`是可执行文件的名称 (14认同)
  • @codehippo:好吧,如果你没有指定`--args`那么_aren't_任何参数传递给可执行文件,所以它几乎不含糊. (9认同)
  • @Kaolin --args必须在可执行文件之前,因为它是gdb的开关.如果它出现之后,gdb如何将它与您希望传递给正在调试的可执行文件的参数区分开来? (8认同)
  • 这会将`gdb`本身的输入重定向到`of`文件,导致gdb尝试从中执行命令 (3认同)
  • @Steven Lu从一些不明原因,gdb man不包含有关--args开关的信息 (2认同)

mar*_*cog 135

将参数传递给rungdb中的命令.

$ gdb ./a.out
(gdb) r < t
Starting program: /dir/a.out < t
Run Code Online (Sandbox Code Playgroud)

  • `r`是`run`的缩写,你可以用任何参数跟随它.就像在这个问题中,它将是:`r arg1 arg2 <file`或者它可能是`run arg1 arg2 <file` (2认同)

unk*_*ulu 7

如果您想使用裸run命令来gdb执行带有重定向和参数的程序,您可以使用set args

% gdb ./a.out
(gdb) set args arg1 arg2 <file
(gdb) run
Run Code Online (Sandbox Code Playgroud)

我无法使用--args参数实现相同的行为,gdb强烈逃避重定向,即

% gdb --args echo 1 2 "<file"
(gdb) show args
Argument list to give program being debugged when it is started is "1 2 \<file".
(gdb) run
...
1 2 <file
...
Run Code Online (Sandbox Code Playgroud)

这实际上重定向了 gdb 本身的输入,而不是我们真正想要的

% gdb --args echo 1 2 <file
zsh: no such file or directory: file
Run Code Online (Sandbox Code Playgroud)