linux - 如何制作 expect 脚本将命令输入 GDB?

标签 linux bash shell scripting expect

我想编写一个 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/

相关文章:

c - 如何获取 C 语言中的本地 shell 变量?

linux - 将 wget 与 OpenID 登录结合使用

linux - 使用 find -exec {} + 跟踪参数

linux - `nohup` 通过 PID 调用一个已经运行的进程(类似于 AIX nohup -p)

无法返回C中线程的调度优先级

linux - 查找磁盘中目录的使用率%

linux - Shell 脚本,在执行一段时间后杀死进程

LINUX - shell 脚本查找并列出所有有权在目录树中写入的文件

Arduino Yun 上的 Linux openWRT shell : save input line from Serial Port to file

linux - 使用 linux 命令行识别文件中具有 2 个字段的重复行