Dスクリプト文法詳細
先の実行例では,
述語(前提条件)の記述
第2回における説明の際に割愛したDスクリプトの文法要素を補うと,
リスト4 Dスクリプト文法
<Probe-Description> [, ....]
[/<Predicate>/]
{
[<Action> ....]
}
<Predicate>
は一般に
<Predicate>
部分には,
<Predicate>
部分を記述する場合,/
")<Predicate>
が省略された場合は,
Dスクリプトでは,
self
を使用したデータ保持
先ほどのDスクリプトには,self->traced
"という記述がありましたが,
この記述は,
Dスクリプトにおける変数をそれぞれの通用範囲の点から見た場合,
- - 大域変数
(global varible) - "
VarName
" 形式 - - 節固有変数(clause local variable)
- "
this->VarName
" 形式 - - スレッド固有変数(thread local variable)
- "
self->VarName
" 形式
「大域変数」
大域変数および節固有変数は,
但し,
スレッド固有変数に設定した値は,
大域変数や節固有変数は,
- ※1)
- 第2回での節固有変数に対する
「局所変数のようなもの」 という説明は, あの時点での説明としてはそこそこ妥当ではあるものの, 厳密に通用範囲の点から考えた場合, 実はあまり適切ではありません。 - ※2)
- 実のところ第2回で説明したメモリ内容表示の例も,
マルチスレッド稼動の際には節固有変数ではなくスレッド固有変数で alloca
の戻り値を格納すべきです。
複数条件の組み合わせ
<Predicate>
部分はC/&&
"や"||
"を用いて複数の式を列挙することが可能です。
複数条件記述が使えることで,
- 関数
f4()
呼び出し以後のフローを採取 - ただし,
関数 f2
呼び出し以後のフローは不要
このような絞り込みを行うDスクリプトは,
リスト5 抑止付きの絞り込み
pid$target:show_nesting:f4:entry
{
self->traced = 1;
}
pid$target:show_nesting:f2:return
/self->traced/
{
self->suppressed = 0;
}
pid$target:show_nesting::entry,
pid$target:show_nesting::return
/self->traced && !self->suppressed/
{
}
pid$target:show_nesting:f2:entry
/self->traced/
{
self->suppressed = 1;
}
pid$target:show_nesting:f4:return
{
self->traced = 0;
}
self->traced
が採取の許可を,self->suppressed
が採取の抑止を制御しています。
引数・ 戻り値を参照する述語の記述
述語には,entry
プローブ使用時)return
プローブ使用時)
たとえば,XXXX
の関数xxxxx()
が非0で復帰する際に,arg0
)
リスト6 戻り値を用いた述語記述
pid$target:XXXX:xxxx:entry
{
self->arg0 = arg0;
}
pid$target:XXXX:xxxx:return
/arg1 != 0/
{
printf("arg0=%p", self->arg0);
}
述語"/arg1 == 0/
"に記述されたarg1
は,pid
プロバイダのreturn
プローブにおけるarg1
を意味しますので,xxxx()
の戻り値を参照することになります。