我正在尝试使用Perl脚本自动化Metaware Debugger工具。还有命令行选项来运行该工具。但是,在调用该工具并设置源和目标路径后,我的脚本将无法控制该工具。
是否有任何模块或方法可以通过Perl实现整个工具控制?
答案 0 :(得分:0)
在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”命令,请安装Expect软件包& amp;使用此shell命令的依赖项(在bash中):
$ cpan install Expect
<强>更新强>
大多数人(包括我自己)都无法访问专有的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
,您应该在运行perl脚本来控制gdb会话之前使用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,则需要先安装它们。