我想编写一个Expect脚本,只需将命令输入GDB,无论其输出如何。然后我想获取GDB输出的某些部分,并使用shell命令(如grep和sed)从中提取信息。然后我想使用这些信息在GDB中输入更多命令。
例如,我会通过发送命令来启动回溯跟踪" bt"从期望脚本到GDB。然后我会贪图像#34; pardrivr"并获取与之关联的行号。然后我会输入" f lineNumberOfPardrivr"进入GDB。将重复此过程,直到最终提取出正确的信息。
这可能吗?如果是这样,最好的方法是什么?
由于
答案 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