dtraceに関する情報のリンクと、NetBSD dtraceでグローバルに使える組み込み変数&関数について
まず、いきなりだが、dtraceの概要は以下のページなどで紹介されているので参考にされたし。
http://nippondanji.blogspot.jp/2010/02/ddtrace.html
https://blogs.oracle.com/yappri/entry/dtrace
http://docs.oracle.com/cd/E24845_01/html/E22189/gcfpv.html
なので、dtraceの文法などについてはここでは記載しない。
(まだakachochinが完全に文法などを把握していないこともある...)
またさらにググってみると、OracleのWebPageにはDtraceの文法が載っているようだ。
これを参考にしつつ頑張ってみたい。
で、終わりではあんまりなのでこのページのサンプルプログラムを入力、実行してみる。
ところが、エラーが起こり、実行できない。どうやら、SolarisとNetBSDではプロバイダなどが違うようだ。
また、利用可能な述語も違うようで、サンプルプログラムの/uid==0/も使えないようだ。
ところで、プローブ記述はPROVIDER:MODULE:FUNCTION:NAMEの4つから構成される。
システムにあるプローブのリストはdtrace -lで表示できる。
# dtrace -l | head -n 10 ID PROVIDER MODULE FUNCTION NAME 1 dtrace BEGIN 2 dtrace END 3 dtrace ERROR 4 fbt netbsd AES_GMAC_Final entry 5 fbt netbsd AES_GMAC_Final return 6 fbt netbsd AES_GMAC_Init entry 7 fbt netbsd AES_GMAC_Init return 8 fbt netbsd AES_GMAC_Reinit entry 9 fbt netbsd AES_GMAC_Setkey entry
例えば上記ID8のプローブに対して何かしたい場合、プローブ記述は
fbt:netbsd:AES_GMAC_Reinit:entry
となる。
述語に指定できるものはどんなものがあるのだろうか?また、組み込み変数のようなものはあるのか?(例えば先のWebPageに出てきた「execname」など)
また、このWebPageの下の方には「集計関数」というものもあるらしいことがわかる。
こういった情報はソースのどこかにないものか。少なくともNetBSDで動作が確認できている「execname」で全ソースをgrepしてみた。
すると気になる検索結果があった。それを抜粋する。
external/cddl/osnet/dist/lib/libdtrace/common/dt_open.c:{ "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME, external/cddl/osnet/dist/uts/common/dtrace/dtrace.c: * builtin values such as 'execname' and 'probefunc.' external/cddl/osnet/dist/uts/common/dtrace/dtrace.c: * curthread, pid, ppid, tid, execname, zonename, uid and gid variables. external/cddl/osnet/dist/uts/common/sys/dtrace.h: * execname <= Current executable name
external/cddl/osnet/dist/lib/libdtrace/common/dt_open.cには
static const dt_ident_t _dtrace_globals[] = { { "alloca", DT_IDENT_FUNC, 0, DIF_SUBR_ALLOCA, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_func, "void *(size_t)" }, { "arg0", DT_IDENT_SCALAR, 0, DIF_VAR_ARG0, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int64_t" }, { "arg1", DT_IDENT_SCALAR, 0, DIF_VAR_ARG1, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int64_t" }, (略) { "vtimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_VTIMESTAMP, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "uint64_t" }, { "walltimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_WALLTIMESTAMP, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "int64_t" }, #if defined(sun) { "zonename", DT_IDENT_SCALAR, 0, DIF_VAR_ZONENAME, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" }, #endif { NULL, 0, 0, 0, { 0, 0, 0 }, 0, NULL, NULL } };
というテーブルが。このテーブルの各エントリの最初のメンバがグローバルな組み込み変数だったり、組み込み関数だったりするわけか。
(300行程度あるので、さすがに全て載せられない・・・。NetBSD6.0リリース版ではこのソースが該当するソースなので、このソースの_dtrace_globalsテーブルを参考にしてほしい。
これをもとに、dtrace言語の勉強をしてみますか・・・。
今回は私の体調不良や忘年会などの飲みがあり、NetBSDのdtraceに関する調査にあまり進展がなかったが、お許し願いたい。