このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。
述語は、プローブに関連付けられたアクションをDTraceで起動するかどうかを選択する論理文です。 たとえば、次のプログラムsc1000.d
の述語では、変数i
の値を調査しています。 このプログラムは、Cスタイルのコメントを含める方法も示しています。
#pragma D option quiet BEGIN { /* Initialize i */ i = 1000; } syscall:::entry /i > 0/ { /* Decrement i */ i--; } syscall:::entry /(i % 100) == 0/ { /* Print i after every 100 system calls */ printf("i = %d\n",i); } syscall:::entry /i == 0/ { printf("i = 0; 1000 system calls invoked\n"); exit(0); /* Exit with a value of 0 */ }
このプログラムは、1000の値でi
を初期化し、プロセスによってシステム・コールが起動されるたびにその値を1ずつ減分し、100回のシステム・コールごとにその値を出力して、1の値が0に到達したときに終了します。 抑制モードでプログラムを実行すると、次のような出力が生成されます。
# dtrace -s sc1000.d
i = 900
i = 700
i = 800
i = 600
i = 500
i = 400
i = 300
i = 200
i = 100
i = 0
i = 0; 1000 system calls invoked
カウントダウン・シーケンスの順序は予想どおりではないことに注意してください。 i=800
の出力が、i=700
の出力の後に出現しています。 抑制モードを無効にすると、その理由が、dtraceではすべてのCPUコアで起動されるプローブから情報が収集されるためであることがわかります。 マルチスレッド環境では、DTraceによるランタイム出力の順序は予測できません。
# dtrace -s sc1000.d
dtrace: script 'sc1000.d' matched 889 probes
CPU ID FUNCTION:NAME
0 457 clock_gettime:entry i = 900
0 413 futex:entry i = 700
1 41 lseek:entry i = 800
1 25 read:entry i = 600
1 25 read:entry i = 500
1 25 read:entry i = 400
1 71 select:entry i = 300
1 71 select:entry i = 200
1 25 read:entry i = 100
1 25 read:entry i = 0
1 25 read:entry i = 0; 1000 system calls invoked
次の例は、システムでdateコマンドが実行されるたびに、write()
システム・コールに指定されたファイル記述子、出力文字列および文字列長を表示する実行可能なDTraceスクリプトです。
#!/usr/sbin/dtrace -s #pragma D option quiet syscall::write:entry /execname == "date"/ { printf("%s(%d, %s, %4d)\n", probefunc, arg0, copyinstr(arg1), arg2); }
あるウィンドウでスクリプトを実行し、別のウィンドウでdateコマンドを入力すると、最初のウィンドウに次のような出力が表示されます。
write(1, Wed Aug 15 10:42:34 BST 2012 , 29)