我正在尝试使用Perl脚本自动化Metaware调试器工具。还有一些命令行选项可以运行该工具。但是,在调用该工具并设置源路径和目标路径之后,我的脚本将失去对该工具的控制。
有没有什么模块或方法可以让我用Perl实现整个工具的控制?
发布于 2013-07-12 10:14:55
在Linux上,您可以使用来自CPAN的Expect perl模块,它是专门为控制命令行应用程序而设计的。此CPAN模块模仿著名的Expect程序,该程序是作为Tcl的扩展编写的,用于控制命令行应用程序。
Click here for the latest version of Expect on CPAN
Click here for associated documentation
假设您的PATH中有可用的perl install和"cpan“命令,请使用以下shell命令(在bash中)安装Expect包和依赖项:
预期安装
$ cpan
更新:
大多数人(包括我自己)都无法访问专有的Metware调试器来测试/演示对该特定工具的控制。
幸运的是,就与终端会话交互的方式而言,大多数命令行调试器都非常相似,因此希望使用perl Expect模块控制gdb调试器的演示能够相当容易地移植到您的环境中。
下面是一个示例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,您应该在运行控制gdb会话的perl脚本之前使用gcc -g -o x x.c编译该文件。
#include <stdio.h>
int main(int argc, char *argv[]) {
int a = (argc > 1) ? atoi(argv[1]) : 13;
printf("a = %d\n", a);
return 0;
}请注意,在编译x.c文件之前,如果您的系统中尚未安装gcc和gdb,则需要首先使用yum安装它们。
https://stackoverflow.com/questions/17606334
复制相似问题