0

Perl スクリプトを使用して Metaware Debugger ツールを自動化しようとしています。そのツールを実行するためのコマンド ライン オプションもあります。ただし、ツールを呼び出してソースと宛先のパスを設定すると、スクリプトがツールを制御できなくなります。

ツール全体を Perl で制御できるモジュールまたは方法はありますか?

4

1 に答える 1

0

Linux では、コマンド ライン アプリケーションを制御するために特別に設計された CPAN の Expect perl モジュールを使用できます。この CPAN モジュールは、コマンド ライン アプリを制御するために Tcl の拡張として作成された有名な Expect プログラムをモデルにしています。

CPAN の最新バージョンの Expect については、ここをクリックしてください

関連ドキュメントはこちら

PATH で perl install と "cpan" コマンドが動作していると仮定して、このシェル コマンド (bash で) を使用して Expect パッケージと依存関係をインストールします。

$ cpan install 期待

アップデート:

ほとんどの人 (私を含む) は、専用の Metware Debugger にアクセスして、その特定のツールの制御をテスト/デモンストレーションすることはできません。

幸いなことに、ほとんどのコマンドライン デバッガーは、ターミナル セッションと対話する方法に関してかなり似ているため、うまくいけば、gdbperl Expect モジュールを使用してデバッガーを制御するデモンストレーションが、使用している環境にかなり簡単に変換されます。

CPAN Expect モジュールを使用して単純な C プログラムの gdb デバッグ セッションを制御する 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;

以下は、gdb セッションを制御するために perl スクリプトを実行する前に、x.c使用してコンパイルする必要がある C プログラム ファイルです。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;
}

xc ファイルをコンパイルする前に、まず yum を使用して gcc と gdb をインストールする必要があることに注意してください。

于 2013-07-12T02:14:55.437 に答える