我想编写一个脚本,(在某些条件下)将执行 gdb 并使用一组参数 Y 自动运行一些程序 X。一旦程序完成执行,用户应该留在 gdb 的提示符下,直到他/她明确退出它.
一种方法是让脚本将运行命令和参数 Y 输出到某个文件 F,然后让脚本像这样调用 gdb:
gdb X < F
但是有没有办法在不引入临时文件的情况下做到这一点?
给定程序X
和参数列表的最简单方法a b c
:
X a b c
就是使用gdb
'--args
选项,如下:
gdb --args X a b c
gdb --help
有这个要说的--args
:
--args Arguments after executable-file are passed to inferior
这意味着之后的第一个参数--args
是要调试的可执行文件,之后的所有参数都按原样传递给该可执行文件。
如果你想通过 GDB 运行一些命令,然后让它退出或运行完成,只需执行
echo commands | gdb X
如果您想在运行这些命令后将其留在命令提示符处,您可以执行
(echo commands; cat) | gdb X
这导致将命令回显到 GDB,然后您键入该cat
进程,该进程将其标准输入复制到标准输出,该标准输出通过管道传输到 GDB。
有选项-x,例如
gdb -x gdb_commands exe_file
其中gdb_commands可以是例如(在 android 模拟器的情况下):
target remote :5039
在这里尝试了所有答案之后,
但是,事实证明您可以只使用 -ex,如下所示:
gdb -ex "target remote localhost:1234"
您还可以多次指定 -ex 来运行多个命令!
gdb target -e "my-automation-commands"
my-automation-commands 包含您通常想要运行的任何内容,
break 0x123
set args "foo" bar 2
r
如果您有一些标准的初始化脚本,则严格来说不是临时文件;)
好吧,这只是一个评论,而不是真正的答案 - 只是想包含一些代码片段。我在bash
/Ubuntu Lucid 上——对我来说,我遇到了与以下问题几乎相同的问题:“ GDB 在将命令通过管道传输到 STDIN 时遇到问题 - Unix Linux 论坛 - Fixunix.com ”。
基本上,我想实现与以下代码段相同的效果:
$ gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) pwd
Working directory /media/work/dir.
(gdb)
...除了,我想以pwd
某种方式“管道”命令,然后保持 gdb 打开(如上例所示)。
我在这里尝试了一些建议,唯一对我有用的是(echo commands; cat) | gdb
语法 - 以及(有点工作)Here Strings - 这是我的结果:
$ echo "pwd" | gdb
(gdb) Hangup detected on fd 0
error detected on stdin
$ echo "pwd" | gdb -x /dev/stdin
GNU gdb (GDB) 7.1-ubuntu
...
/dev/stdin: Invalid argument.
(gdb) Hangup detected on fd 0
error detected on stdin
$ gdb -x <(echo "pwd")
GNU gdb (GDB) 7.1-ubuntu
...
/dev/fd/63: No such file or directory.
(gdb) q
$ gdb -e "pwd"
GNU gdb (GDB) 7.1-ubuntu
...
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) q # nothing happens
$ gdb <<<"pwd"
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) quit # OK, but autoexits
$ gdb <<<"pwd
> "
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) Working directory /media/work/dir.
(gdb) quit # with a line break at end, it execs twice, then exits
# the only one OK for my needs -
# except locks after quit, and needs Ctrl-C
$ (echo "pwd"; cat) | gdb
GNU gdb (GDB) 7.1-ubuntu
...
(gdb) Working directory /media/work/dir.
(gdb) q
^C
好吧,希望这对某人有所帮助,
干杯!
编辑:现在至少我知道为什么进程替换不起作用 - 它将使用一个临时文件描述符,它不能被识别为文件ls
(因此gdb
肯定无法读取它;此外,引用几乎立即消失,除非进程以某种方式被阻止,与cat
) - 查看终端日志片段:
$ echo -e "***\n" <(echo "pwd") "\n***\n`cat <(ls -C /dev/fd ; echo; for ix in /dev/fd/*; do irl=$(readlink -f $ix); echo $ix -\> $irl; ls -la $ix 2>&1; ls -la $irl 2>&1; echo '______'; done ; ls -C /dev/fd )`"
***
/dev/fd/63
***
0 1 2 3 63
/dev/fd/0 -> /dev/pts/0
lrwx------ 1 user user 64 2010-11-07 21:18 /dev/fd/0 -> /dev/pts/0
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/1 -> /proc/10713/fd/pipe:[236191]
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/1 -> pipe:[236151]
ls: cannot access /proc/10713/fd/pipe:[236191]: No such file or directory
______
/dev/fd/2 -> /dev/pts/0
l-wx------ 1 user user 64 2010-11-07 21:18 /dev/fd/2 -> pipe:[236151]
crw--w---- 1 user tty 136, 0 2010-11-07 21:18 /dev/pts/0
______
/dev/fd/255 -> /proc/10721/fd/255
ls: cannot access /dev/fd/255: No such file or directory
ls: cannot access /proc/10721/fd/255: No such file or directory
______
/dev/fd/3 -> /proc/10725/fd/3
ls: cannot access /dev/fd/3: No such file or directory
ls: cannot access /proc/10725/fd/3: No such file or directory
______
0 1 2 3
此外,向上/向下键无法与 一起使用(echo commands; cat) | gdb
,因为这就是 cat 的行为方式;如果我们只是运行cat
,它将标准输入复制到标准输出,我们得到:
$ cat # or `cat -`: and start pressing up/down keys - and get:
^[[A^[[B^[[A^[[B^[[A^[[B^C
您可以尝试使用 开启原始字符模式(或关闭缓冲/熟化模式)stty -cooked
,然后cat
将字符都写为^[[A
,并移动光标 - 不幸的是,在这种模式下,Ctrl-C 不再起作用,所以您不能这样关闭cat
...
使用 bash,您可以创建一个脚本,为您正在执行的任何可执行文件提供类似用户的输入:
#!/bin/sh
gdb X <<GDB_INPUT
pwd
run X a b c
quit
GDB_INPUT
cat F | gdb X
应该是相同的。因此,您可以使用任何产生输出并将其通过管道传输到 gdb 的东西,而不是这里的 cat 命令。
我假设您是正确的并且 gdb 从标准输入读取。