これまで説明してきたDスクリプトでは,
今回は,
特定関数の呼び出し契機での絞り込み
本連載でこれまで例示してきたDスクリプトは,
しかし,
- 採取結果の中から調査対象を特定するのが難しくなる
- 採取結果の記録に必要なディスク領域が増加する
このようなデメリットを無くすためには,
たとえば,show_
)
リスト1 関数の入れ子show_
)
void f1(){ }
void f2(){ f1(); }
void f3(){ f2(); }
void f4(){ f3(); }
int
main(int argc,
const char* argv[])
{
f4();
return 0;
}
これまで使用してきた関数フロー採取用のDスクリプトを使用した場合,
リスト2 全関数フローの採取結果
CPU FUNCTION
0 -> _start
0 -> __fsr
0 <- __fsr
0 -> main
0 -> f4
0 -> f3
0 -> f2
0 -> f1
0 <- f1
0 <- f2
0 <- f3
0 <- f4
0 <- main
ここで,f3()
呼び出しから先の処理である,
この前提における関数フローの採取は,f3()
が呼ばれた時点から開始し,f3()
から復帰した時点で停止する,
このような採取範囲の絞り込みを行うには,
リスト3 採取範囲の絞り込みwatch_
)
pid$target:show_nesting:f3:entry
{
self->traced = 1;
}
pid$target:show_nesting::entry,
pid$target:show_nesting::return
/self->traced/
{
}
pid$target:show_nesting:f3:return
{
self->traced = 0;
}
それでは関数フローを採取してみましょう。
図1 caption
$ dtrace -F \ -s watch_focused.d \ -c ./show_nesting dtrace: script 'watch_focused.d' matched 15 probes CPU FUNCTION 0 -> f3 0 -> f2 0 -> f1 0 <- f1 0 <- f2 0 <- f3 dtrace: pid 12820 has exited $
リスト2と比較してみればおわかりのように,f3()
呼び出し以後の関数フローのみが,