调用gdb以自动将参数传递给正在调试的程序

use*_*162 38 shell gdb

我想编写一个脚本(在某些条件下)将执行gdb并自动运行一些带有一些参数Y的程序X.一旦程序执行完毕,用户应该保持在gdb的提示符下,直到他/她显式退出它.

执行此操作的一种方法是让脚本将run命令加参数Y输出到某个文件F,然后让脚本调用gdb,如下所示:

gdb X < F
Run Code Online (Sandbox Code Playgroud)

但有没有办法在不引入临时文件的情况下执行此操作?

谢谢.

Nat*_*man 85

给定程序X和参数列表,最简单的方法a b c:

X a b c
Run Code Online (Sandbox Code Playgroud)

是使用gdb--args选项,如下:

gdb --args X a b c
Run Code Online (Sandbox Code Playgroud)

gdb --help有这个说--args:

--args Arguments after executable-file are passed to inferior

这意味着后面的第一个参数--args是要调试的可执行文件,之后的所有参数都按原样传递给该可执行文件.

  • 你甚至可以`gdb -ex run --args prog arg ...`让程序自动启动 (11认同)

Ada*_*eld 28

如果你想通过GDB运行一些命令,然后让它退出或运行完成,那就行了

echo commands | gdb X
Run Code Online (Sandbox Code Playgroud)

如果要在运行这些命令后将其保留在命令提示符下,则可以执行此操作

(echo commands; cat) | gdb X
Run Code Online (Sandbox Code Playgroud)

这导致将命令回显到GDB,然后键入cat进程,该进程将其stdin复制到stdout,该stdout通过管道传输到GDB.

  • 请注意,如果您这样做(所有readline编辑功能,历史记录等),您将失去shell交互性. (2认同)

小智 8

有选项-x,例如

gdb -x gdb_commands exe_file
Run Code Online (Sandbox Code Playgroud)

其中gdb_commands可以是例如(在android模拟器的情况下):

target remote :5039
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,如果要避免使用临时文件,可以使用进程替换:`gdb -x <(echo commands)exe_file` (2认同)
  • 只需使用`gdb -ex'foo'-ex'bar'`来运行gdb,并先执行命令`foo`和`bar`。 (2认同)

cra*_*2be 6

在这里尝试了所有的答案后,

  1. echo/cat hack虽然很聪明,却打破了gdb的一些重要功能.最值得注意的是,所有用户提示都会自动回答(因此您没有机会确认可能存在危险的操作),而Ctrl + C(停止正在调试的进程)最终会杀死cat,所以实际上你不能之后跟gdb交谈.
  2. -x选项应该可以工作,但我无法使用我的gdb版本,它需要一个临时文件.

但是,事实证明你可以使用-ex,就像这样:

gdb -ex "target remote localhost:1234"
Run Code Online (Sandbox Code Playgroud)

您还可以指定-ex多次以运行多个命令!