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を参考に次は集積体を追ってみたい。