0

我正在尝试使用 Perl 脚本自动化 Metaware Debugger 工具。还有用于运行该工具的命令行选项。但是,在调用该工具并设置源路径和目标路径后,我的脚本将失去对该工具的控制。

是否有任何模块或方法可以通过 Perl 实现整个工具控制?

4

1 回答 1

0

在 Linux 上,您可以使用 CPAN 中的 Expect perl 模块,该模块专为控制命令行应用程序而设计。这个 CPAN 模块是根据著名的 Expect 程序设计的,该程序是作为 Tcl 的扩展来控制命令行应用程序而编写的。

单击此处获取最新版本的 CPAN 上的 Expect

单击此处获取相关文档

假设你的 PATH 上有运行 perl install 和“cpan”命令,使用这个 shell 命令(在 bash 中)安装 Expect 包和依赖项:

$ cpan 安装期望

更新:

大多数人(包括我自己)都无法访问专有的 Metware 调试器来测试/演示对该特定工具的控制。

幸运的是,大多数命令行调试器在与终端会话交互的方式方面都非常相似,因此希望gdb使用 perl Expect 模块控制调试器的演示将相当容易地转换到您的环境中。

下面是一个示例 perl 脚本,它使用 CPAN Expect 模块来控制一个简单 C 程序的 gdb 调试会话:

#!/bin/env perl

use Expect;

my @params = ("./x");
my $default_timeout = 3;

my $exp = new Expect;
$exp->raw_pty(1);
my $exp = Expect->spawn("gdb", @params)
  or die "Cannot spawn $command: $!\n";

$exp->slave->stty(qw(raw));

# Send commands to gdb session, wait for (gdb) prompt before each ->send
$exp->send("set args 4\n");
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("b main\n"); }]);
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("r\n"); }]);
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("n\n"); }]);
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("p a\n"); }]);
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("c\n"); }]);
$exp->expect($default_timeout, [ qr/\(gdb\) /, sub { @_[0]->send("quit\n"); }]);
$exp->expect($default_timeout, [ qr/\n/, sub { }]);
$exp->soft_close();
0;

下面是 C 程序文件x.c,您应该gcc -g -o x x.c在运行 perl 脚本以控制 gdb 会话之前使用 with 编译它。

#include <stdio.h>

int main(int argc, char *argv[]) {
    int a = (argc > 1) ? atoi(argv[1]) : 13;
    printf("a = %d\n", a);
    return 0;
}

请注意,如果您的系统上还没有 gcc 和 gdb,您需要先使用 yum 安装它们,然后才能编译 xc 文件。

于 2013-07-12T02:14:55.437 回答