调用gdb自动将parameter passing给正在debugging的程序

我想编写一个脚本(在某些情况下)将执行gdb并自动运行一些带有一些参数Y的程序X.一旦程序完成执行,用户应该保持在gdb的提示符下,直到s / he明确退出。

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

gdb X < F 

但有没有办法做到这一点,而不引入临时文件?

谢谢。

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

 echo commands | gdb X 

如果您想在运行这些命令后在命令提示符下将其保留,可以这样做

 (echo commands; cat) | gdb X 

这导致将命令回显给GDB,然后你inputcat进程,它将stdin复制到输出到GDB的stdout中。

最简单的方法是给定一个程序X和参数列表abc

 X abc 

就是用gdb--args选项,如下所示:

 gdb --args X abc 

gdb --help有这个说--args

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

这意味着--args之后的第一个参数是要debugging的可执行文件,并且之后的所有参数都将传递给该可执行文件。

有选项-x ,例如

 gdb -x gdb_commands exe_file 

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

 target remote :5039 

在尝试所有的答案后,

  1. echo / cat hack虽然聪明,却突破了gdb的一些重要特性。 最值得注意的是,所有的用户提示都会被自动回答(所以你没有机会确认潜在的危险操作),而Ctrl + C(停止正在debugging的进程)最终会杀死cat,所以你实际上不能之后与gdb交谈。
  2. -x选项应该可以工作,但是我不能让它与我的gdb版本一起工作,而且它需要一个临时文件。

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

 gdb -ex "target remote localhost:1234" 

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

那么,这只是一个评论,不是一个真正的答案 – 只是想包括一些代码片段。 我在bash / Ubuntu Lucid上 – 对我来说,我遇到了和上面几乎相同的问题:“ GDB在将命令传递给STDIN – Unix Linux Forum – 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) 

…除此之外,我想以某种方式“pipe” pwd命令,并保持gdb之后打开(如上例)。

我在这里尝试了一些build议,唯一对我有用的是(echo commands; cat) | gdb (echo commands; cat) | gdb语法 – 以及(有点工作) 在这里string – 这里是我的结果:

 $ 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 

那么,希望这可以帮助别人,
干杯!

编辑︰现在至less我知道为什么进程replace将无法正常工作 – 它会使用一个临时文件描述符,它不能被识别为文件的ls因此gdb肯定无法读取它;此外,引用几乎立即消失,除非进程是不知何故被封锁,如cat ) – 请参阅terminal日志片段:

 $ 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 (echo commands; cat) | gdb ,因为这是猫的行为; 如果我们只是运行cat所以它复制标准input到标准输出,我们得到:

 $ cat # or `cat -`: and start pressing up/down keys - and get: ^[[A^[[B^[[A^[[B^[[A^[[B^C 

你可以尝试打开原始字符模式( 或closures缓冲/煮熟模式 ),然后cat会写字符为^[[A ,并移动光标 – 不幸的是,在这种模式下,Ctrl-C不能再工作了,所以你不能以这种方式closurescat

 gdb target -e "my-automation-commands" 

my-automation-commands包含你通常想要运行的任何东西,

 break 0x123 set args "foo" bar 2 r 

不是严格的临时文件,如果你有一些标准的初始化脚本;)

使用bash,你可以创build一个脚本,给用户input你正在执行的任何可执行文件:

 #!/bin/sh gdb X <<GDB_INPUT pwd run X abc quit GDB_INPUT 

cat F | gdb X cat F | gdb X应该是相同的。 所以你可以使用任何产生输出和pipe道的东西进入gdb而不是cat命令。

我假设你是正确的,并从标准input读取gdb。