|
|
前のページ 1 2 3 4 次のページ
|
|
インタラクティブ機能
|
ダンプ解析では、あるコマンドを実行して、その結果を元に次の手を打つ(別のコマンドを実行する)という対話的な機能が重要である。既存のツールを使った場合は、コマンドの実行結果のある部分から必要な情報を抜き出して、次のコマンドの引数に利用したり、コマンドをパイプやファイルへのリダイレクトを経由して外部コマンドで加工したりしなければならない。
Aliciaでは、実行結果を変数に格納することが可能であり、前のコマンドの実行結果をコマンドライン上でPerl関数のインプットパラメータとして利用することができる。
例えば、ダンプ解析を進めていくうちに、pidからtask_struct構造体アドレスを求めなければならない場面に遭遇したとする。このようなときに、既存のダンプ解析ツールを利用していた人やカーネルのソースに精通した人は、カーネルのソースコード(pid.c)で定義されている「find_task_by_pid」関数の実装を考えるかもしれない。
まずは、その関数を見てみよう。以下はカーネルのソースコードからの転載である。
|
#define pid_hashfn(x) ((((x) >> 8) ^ (x)) & (PIDHASH_SZ - 1))
static inline task_t *find_task_by_pid(int pid)
{
task_t *p, **htable = &pidhash[pid_hashfn(pid)];
for(p = *htable; p && p->pid != pid; p = p->pidhash_next)
;
return p;
}
|
この場合、それほど大きなコードではないため、これをPerlでコーディングしてもよいし、既存ダンプ解析ツールであるcrashの拡張コマンドとして、pidからtask_sturct構造体アドレスを得る変換コマンドを作成してもよいだろう。しかし、早急にダンプを解析しなければならない場合、既存のコマンドの結果をPerlで加工するだけの方が、コンパイルもいらず、ずっと簡単に対応できる。
以下の例では、crashのtaskコマンド(pid、またはtask_struct構造体アドレスを引数に、プロセスの詳細な情報を整形して表示するコマンド)の結果を利用し、pidからtask_struct構造体のアドレスを求めている。
|
alicia> $task = pass_through('task 1')
Alicia> @tasks = $task =~ /TASK: (\w+)/g
alicia> print @tasks;
f7f70000
|
インタラクティブ機能は、ダンプ解析者が既存コマンドの結果をAliciaのAPIであるpass_through関数を使用してPerlの変数に代入し、Perlの機能を利用して希望するデータに加工するための環境を提供する。
なお、上記の例のprint文で出力されるデータはシステムによって異なるので注意されたい。
これは、少々泥臭い方法であるが、解析を素早く行うためには、とても有効な方法である。
|
スクリプト機能
|
インタラクティブ機能で示した例をスクリプト化してみよう。以下がそのスクリプトの例である。このスクリプトをfind_task_by_pid.ldasという名前で保存しておく。
|
sub find_task_by_pid {
my $pid = shift || 1;
my @tasks = pass_through("task $pid") =~ /TASK: (\w+)/g;
return wantarray ? @tasks : $tasks[0];
}
1;
|
Aliciaで実行するダンプ解析スクリプトは、Perlのrequire関数が読み込める形式でなければならない。そのため、スクリプトファイルの最後に「1」が必要となっている。
さて、このスクリプトをAlicia上にローディングして実行してみよう。
|
alicia> load 'find_task_by_pid.ldas'
alicia> $task = find_task_by_pid(1)
alicia> print "task = $task"
task = f7f70000
|
Aliciaへ新しいコマンドを認識させるには、loadコマンド(Alicia API)を使う。スクリプトに記述されているサブルーチン名は、Alicia上ではそのままコマンド名として扱われる。
|
前のページ 1 2 3 4 次のページ
|
|
|
|
著者プロフィール
ユニアデックス株式会社 前原 志好
日本ユニシス(株)入社後、米国UNISYS製メインフレームのカーネルを担当する。2004年4月から、所属組織ごとユニアデックス(株)に転籍。その後OSS関連作業に着手。今年は、メインフレーマーとの掛け橋(トランスレータ)役を担当する。
|
|
|
|