我想编写一个 Expect 脚本,它将简单地将命令输入到 GDB 而不管其输出。然后我想使用 grep 和 sed 等 shell 命令获取 GDB 输出的某些部分并从中提取信息。然后我想使用这些信息向 GDB 输入更多命令。
例如,我会通过从 expect 脚本向 GDB 发送命令“bt”来启动回溯。然后我将 grep 查找诸如“pardrivr”之类的词并获取与其相关联的行号。然后我会在 GDB 中输入“f lineNumberOfPardrivr”。将重复此过程,直到最终提取出正确的信息。
这可能吗?如果是这样,执行此操作的最佳方法是什么?
谢谢
最佳答案
我的 0.02 美元:我会在 ksh/bash/zsh 下使用协进程或命名管道。容易多了。请参阅:https://unix.stackexchange.com/questions/86270/how-do-you-use-the-command-coproc-in-bash
此外,考虑将 gdb 的输出tee'ing 到您在另一个 xterm 中cat 的命名管道中。如果您可以看到 gdb 输出的副本,则可以更轻松地调试脚本正在读取的内容。
编辑添加:
仍然无法发表评论。 *叹息*
批处理模式下的 gdb,或通过简单的 shell 重定向,不会让我们根据当前的 gdb 输出动态定义命令。协同处理或命名管道方法与技术大致相同,但它允许我们根据通过 grep/sed/awk/perl/whatever 处理的 gdb 输出随意动态创建新输入。 Python 或 Perl 可能更容易使用它们的正则表达式和子进程工具。例如。 (perl) 打开("|gdb ...")
http://perldoc.perl.org/functions/open.html
再次编辑添加:
命名管道是一个 FIFO(先进先出),它的存在很像文件系统中的一个文件。它当然不是真正的文件。它只是可以像文件一样使用的东西。在操作系统缓冲的范围内,您写入的任何内容都可以被读回。 (否则写入会阻塞。)
FIFO 在 Unix、Linux 和 Mac 下可用,但在 Windows 下不可用。您使用 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
关于linux - 如何制作 expect 脚本将命令输入 GDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24998379/