NetBSD dtraceの変数に関するメモ書きなど

今回もあまり調査が進んでいないdtrace。変数関係について資料を読んだので、メモ書き、メモ書き・・・。

スカラ変数(Scalar Variables)
スカラ変数のところの説明によれば、変数を使う際には、明示的な変数宣言は無くてもよいそうだ。

BEGIN
{
	x = 123;
}

連想配列(Associative Arrays)
name[key] = expressionで表現される。
面白いのはkeyは「カンマで区切られた1つまたはそれ以上のexpression」で表現されることである。
例えばPerlみたいに
a["hoge"] = 456;
としてもよいし、
a[123,"hoge"] = 456;
としてもよい。(この場合、「123,"hoge"」がキーになる。)

スレッドローカル変数(Thread-Local Variables)
「->」オペレータを特殊な識別子selfに適用すればよい。
例えば、以下のように。(注意:以下のdtraceスクリプトはプロバイダ名などの関係でNetBSDでは動きません。)

syscall::read:entry
{
	self->read = 1;
}

しかし、「スレッド」の実体が今ひとつよくわからん。

節内ローカル変数(Clause-Local Variables)
説明によれば、以下のような性質を持っている。
*CやC++のオート変数に似ている。
*Dtrace変数の中で唯一0初期化されない変数である。
*アクセスする際には「this->変数名」でアクセスする。
*明示的に変数宣言する際にはthisキーワードを使って宣言を行う。例えば

this int x;
this char c;

BEGIN
{
	this->x = 123;
	this->c = 'D';
}

のように。
しかし、auto変数と違って、異なる節の間で値を共有してしまう。
例えば、以下のスクリプトをclause.dに保存する。

this int x;
this char c;

BEGIN
{
	this->x = 123;
	this->c = 'D';
}

END
{
	printf("%d %c\n",this->x,this->c);
}

dtrace -s clause.dを実行したあとシェルに制御が戻ってこなくなるのでCtrl-Cすると結果が以下のように表示される。

dtrace: script 'clause.d' matched 2 probes

^C
CPU     ID                    FUNCTION:NAME
  0      2                             :END 123 D

節内で値が共有できてしまうのなら、それってスカラ変数とかとどう違うのかが今ひとつわからない。
この辺り、もう少し調べてみる必要がありそうだな・・・。

あとは、アクションについて。
http://docs.oracle.com/cd/E24845_01/html/E22189/gcfbn.html#gcggi
Dtraceの代表的な組み込み変数とアクションについて記載されている。

上のリンク先のスクリプトを実行するときはプロバイダ名に注意。NetBSDでは、syscallプロバイダでなくfbtプロバイダである。

こことOracleのWebPageを参考に次は集積体を追ってみたい。