如何制作一个期望脚本将命令输入GDB?

时间:2014-07-28 15:12:38

标签: linux bash shell scripting expect

我想编写一个Expect脚本,只需将命令输入GDB,无论其输出如何。然后我想获取GDB输出的某些部分,并使用shell命令(如grep和sed)从中提取信息。然后我想使用这些信息在GDB中输入更多命令。

例如,我会通过发送命令来启动回溯跟踪" bt"从期望脚本到GDB。然后我会贪图像#34; pardrivr"并获取与之关联的行号。然后我会输入" f lineNumberOfPardrivr"进入GDB。将重复此过程,直到最终提取出正确的信息。

这可能吗?如果是这样,最好的方法是什么?

由于

2 个答案:

答案 0 :(得分:3)

我的0.02美元:我在ksh / bash / zsh下使用了coprocess或命名管道。更容易。请参阅:https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-bash

另外,将 tee 的gdb输出考虑到另一个xterm中 cat 的命名管道中。如果您可以看到gdb输出的副本,则可以更轻松地调试脚本正在读取的内容。

编辑添加:
仍无法发表评论。 *叹*
批量模式下的gdb,或者通过简单的shell重定向,不允许我们根据当前的gdb输出动态定义命令。协同处理或命名管道方法是相同的技术,但它允许我们根据通过grep / sed / awk / perl / whatever处理的gdb输出随意动态创建新输入。 Python或Perl可能更容易使用它们用于正则表达式和子进程的工具。例如。 (perl)打开(“| gdb ...”) http://perldoc.perl.org/functions/open.html

再次编辑添加:
命名管道是FIFO(先进先出),其存在方式与文件系统中的文件非常相似。当然,这不是一个文件。它只是可以像文件一样使用的东西。您写入的任何内容都可以在OS缓冲的限制范围内读回。 (否则写入将阻止。)

FIFO可在Unix,Linux和& Mac,但不是窗户。你用mkfifo创建它们。任何进程都可以写入它。任何过程都可以从中读取。从我在上面发布的那个链接:

mkfifo in out

cmd <in >out &
exec 3> in 4< out
echo data >&3
read var <&4

从我自己的演奏到演示......

#in BASH

mkfifo IN OUT
#or mkfifo IN OUT ERR

gdb < IN > OUT 2>&1 &
#or gdb < IN > OUT 2> ERR &
#or gdb < IN > OUT &

exec 3> IN
exec 4< OUT

echo "help bt" >&3
while read -t 0.001 var <&4 ; do echo $var; done
echo "help stack" >&3
while read -t 0.001 var <&4 ; do echo $var; done

#don't forget to kill the gdb process when you are done...
echo "quit" >&3
while read -t 0.001 var <&4 ; do echo $var; done

答案 1 :(得分:1)

  

我想编写一个Expect脚本,只需将命令输入GDB,无论其输出如何。

对于非交互式控件,您不需要expect,因为 gdb具有-batch模式且能够阅读({来自文件的{1}}}命令。


此外,当-x stdin 读取输入并产生输出到 stdout 时,标准重定向可能会有效。

例如,我写了一个简单的C程序:

gdb

我能够&#34;脚本&#34;这样的gdb会话:

sh$ cat hello.c
#include <stdio.h>

int main() {
    char    msg[] = "Hello world";

    printf("%s\n", msg);
    return 0;
}

sh$ gcc -ggdb hello.c -o hello