このドキュメントで説明するソフトウェアは、Extended SupportまたはSustaining Supportのいずれかにあります。 詳細は、https://www.oracle.com/us/support/library/enterprise-linux-support-policies-069172.pdfを参照してください。
Oracleでは、このドキュメントに記載されているソフトウェアをできるだけ早くアップグレードすることをお薦めします。

機械翻訳について

11.6.4 述語

述語は、プローブに関連付けられたアクションを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)