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の文法が載っているようだ。
これを参考にしつつ頑張ってみたい。

で、終わりではあんまりなのでこのページのサンプルプログラムを入力、実行してみる。
ところが、エラーが起こり、実行できない。どうやら、SolarisNetBSDではプロバイダなどが違うようだ。
また、利用可能な述語も違うようで、サンプルプログラムの/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に関する調査にあまり進展がなかったが、お許し願いたい。