我正在嘗試使用Perl腳本來自動化Metaware調試器工具。還有命令行選項來運行該工具。但是,調用該工具並設置源和目標路徑後,我的腳本失去了對該工具的控制權。使用perl的工具GUI自動化
是否有任何模塊或方法可以通過Perl實現整個工具控制?
我正在嘗試使用Perl腳本來自動化Metaware調試器工具。還有命令行選項來運行該工具。但是,調用該工具並設置源和目標路徑後,我的腳本失去了對該工具的控制權。使用perl的工具GUI自動化
是否有任何模塊或方法可以通過Perl實現整個工具控制?
在Linux上,您可以使用CPAN中的Expect perl模塊,該模塊專爲控制命令行應用程序而設計。這個CPAN模塊是在着名的Expect程序之後形成的,該程序被編寫爲Tcl的擴展以控制命令行應用程序。
Click here for the latest version of Expect on CPAN
Click here for associated documentation
假設你已經工作的Perl上安裝和PATH 「CPAN」 命令,安裝Expect軟件包使用這個shell命令(在bash)&依賴性:
$ cpan install期望
更新:
大多數人(包括我自己)都無法訪問專有的Metware Debugger來測試/演示對特定工具的控制。
幸運的是,大多數命令行調試器是在他們與終端會話交互的方式方面非常相似,所以希望控制gdb
調試程序用Perl的示範期待模塊將很容易轉化爲您的環境。
下面是使用CPAN期待模塊來控制GDB調試會話一個簡單的C程序的例子perl腳本:
#!/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會話。
#include <stdio.h>
int main(int argc, char *argv[]) {
int a = (argc > 1) ? atoi(argv[1]) : 13;
printf("a = %d\n", a);
return 0;
}
請注意,您需要先使用yum來安裝gcc和gdb,如果他們不已經在你的系統上,然後才能編譯x.c文件。
我在Linux環境下運行它。紅帽Linux。我也考慮過期望,但無法繼續。我還想我應該嘗試使用特定於工具的命令行選項。我非常感謝你和任何進一步的幫助表示讚賞! –