JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
DTrace ユーザーガイド     Oracle Solaris 10 8/11 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  はじめに

2.  DTrace の基本

3.  D 言語を使ったスクリプトの作成

D スクリプトの作成

実行可能な D スクリプト

D リテラル文字列

引数を使用する D スクリプトを作成する

DTrace の組み込み変数

4.  DTrace の使用法

索引

D スクリプトの作成

DTrace プローブを複雑に組み合わせると、コマンド行での使用が難しくなる場合もあります。dtrace コマンドは、スクリプトをサポートしています。dtrace コマンドに -s オプションとスクリプトファイル名を指定することで、スクリプトを指定できます。実行可能な DTrace インタプリタファイルも作成できます。DTrace インタプリタファイルは、必ず #!/usr/sbin/dtrace -s という行から始まります。

実行可能な D スクリプト

次のサンプルスクリプト syscall.d は、実行可能ファイルがシステムコールを開始するたびに、その実行可能ファイルの名前をトレースします。

syscall:::entry
{
   trace(execname);
}

ファイル名は接尾辞 .d で終わっています。D スクリプトの末尾は、通常、この形式になります。このスクリプトは、DTrace コマンド行から次のコマンドを使用して実行できます。

# dtrace -s syscall.d
dtrace: description 'syscall ' matched 226 probes
CPU     ID                     FUNCTION:NAME
  0    312                     pollsys:entry    java
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    168                   sigaction:entry    dtrace
  0    168                   sigaction:entry    dtrace
  0     98                       ioctl:entry    dtrace
^C

このスクリプトは、次の 2 つの手順でコマンド行にファイル名を指定する方法で実行できます。まず、ファイルの先頭行がインタプリタの呼び出しになっていることを確認します。インタプリタの呼び出し行は、#!/usr/sbin/dtrace -s です。次に、ファイルの実行権を設定します。

例 3-1 コマンド行から D スクリプトを実行する

# cat syscall.d
#!/usr/sbin/dtrace -s

syscall:::entry
{
   trace(execname);
}

# chmod +x syscall.d
# ls -l syscall.d
-rwxr-xr-x   1 root     other       62 May 12 11:30 syscall.d
# ./syscall.d
dtrace: script './syscall.d' matched 226 probes
CPU     ID                     FUNCTION:NAME
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    312                     pollsys:entry    java
  0    312                     pollsys:entry    java
  0    312                     pollsys:entry    java
  0     98                       ioctl:entry    dtrace
  0     98                       ioctl:entry    dtrace
  0    234                   sysconfig:entry    dtrace
  0    234                   sysconfig:entry    dtrace
^C

D リテラル文字列

D 言語はリテラル文字列をサポートします。DTrace の文字列は、NULL バイトで終了する文字配列として表現されます。文字列の可視部分は可変長で、NULL バイトの位置によって長さが決まります。DTrace は、各プローブが決まった量のデータをトレースするように、各文字列を固定サイズの配列に格納します。文字列の長さは、あらかじめ定義された文字列制限長を超えることはできません。この制限は D プログラム内で変更できます。dtrace コマンド行で strsize オプションをチューニングして変更することもできます。チューニング可能な DTrace オプションについては、『Solaris 動的トレースガイド』の第 16 章「オプションとチューニング可能パラメータ」を参照してください。デフォルトの制限長は 256 バイトです。

D 言語で文字列を参照するときは、char * 型ではなく、明示的な string 型を使用します。D リテラル文字列については、『Solaris 動的トレースガイド』の第 6 章「文字列」を参照してください。

例 3-2 trace() 関数で D リテラル文字列を使用する

# cat string.d

#!/usr/sbin/dtrace -s

fbt::bdev_strategy:entry
{
   trace(execname);
   trace(" is initiating a disk I/O\n");
}

このリテラル文字列の末尾の記号 \n によって、新規の行が生成されます。このスクリプトを実行するには、次のコマンドを入力します。

# dtrace -s string.d
dtrace: script 'string.d' matched 1 probes
CPU     ID                     FUNCTION:NAME
  0   9215               bdev_strategy:entry   bash is initiating a disk I/O

  0   9215               bdev_strategy:entry   vi is initiating a disk I/O

  0   9215               bdev_strategy:entry   vi is initiating a disk I/O

  0   9215               bdev_strategy:entry   sched is initiating a disk I/O

^C

dtrace コマンドを -q オプション付きで実行した場合、スクリプト内またはコマンド行呼び出しに明示的に指定されたアクションだけが記録されます。dtrace コマンドが通常生成するデフォルト出力は抑制されます。

# dtrace -q -s string.d
ls is initiating a disk I/O
cat is initiating a disk I/O
fsflush is initiating a disk I/O
vi is initiating a disk I/O
^C

引数を使用する D スクリプトを作成する

dtrace コマンドを使って、実行可能なインタプリタファイルを作成できます。このファイルには、実行権を設定する必要があります。ファイルの先頭行は、#!/usr/sbin/dtrace -s にする必要があります。この行には、dtrace コマンドのほかのオプションを指定できます。複数のオプションを指定する場合も、ダッシュ (-) は 1 つだけ入力してください。s オプションは、次の例のように、最後に指定してください。

#!/usr/sbin/dtrace -qvs

dtrace コマンドのオプションを、D スクリプトの #pragma 行を使用して指定できます。次の D スクリプトの抜粋を参照してください。

# cat -n mem2.d
     1  #!/usr/sbin/dtrace -s
     2
     3  #pragma D option quiet
     4  #pragma D option verbose
     5  
     6  vminfo:::
     ...

次の表に、#pragma 行で使用できるオプション名を一覧します。

表 3-1 DTrace コンシューマオプション

オプション名
dtrace 別名
説明
aggrate
time
集積体の読み取りレート
aggsize
size
集積体バッファーサイズ
bufresize
auto または manual
バッファーのサイズ変更ポリシー
bufsize
size
-b
主バッファーサイズ
cleanrate
time
クリーンアップレート
cpu
スカラー
-c
トレースを有効にする CPU
defaultargs
未知のマクロ引数の参照を許可する
destructive
-w
破壊アクションを許可する
dynvarsize
size
動的変数空間のサイズ
flowindent
-F
関数の開始 (entry) をインデントし、その前に -> を付ける。関数の終了 (return) のインデントを解除し、その前に <- を付ける
grabanon
-a
匿名状態を要求する
jstackframes
スカラー
jstack() のデフォルトスタックフレームの数
jstackstrsize
スカラー
jstack() の文字列空間のデフォルトサイズ
nspec
スカラー
投機の数
quiet
-q
明示的にトレースされたデータだけを出力する
specsize
size
投機バッファーサイズ
strsize
size
文字列サイズ
stackframes
スカラー
スタックフレームの数
stackindent
スカラー
stack() ustack() の出力をインデントするときに使用する空白文字の数
statusrate
time
状態チェックレート
switchrate
time
バッファー切り替えレート
ustackframes
スカラー
ユーザースタックフレームの数

一連の組み込みマクロ変数も、D スクリプトで参照できます。これらのマクロ変数は、D コンパイラで定義されます。

$[0-9]+

マクロ引数

$egid

実効グループ ID

$euid

実効ユーザー ID

$gid

実グループ ID

$pid

プロセス ID

$pgid

プロセスグループ ID

$ppid

親プロセス ID

$projid

プロジェクト ID

$sid

セッション ID

$target

ターゲットプロセス ID

$taskid

タスク ID

$uid

実ユーザー ID

例 3-3 PID 引数の例

次の例では、D スクリプト syscalls2.d に、実行中の vi プロセスの PID が渡されます。vi コマンドが終了すると、D スクリプトも終了します。

# cat -n syscalls2.d
     1  #!/usr/sbin/dtrace -qs
     2
     3  syscall:::entry
     4  /pid == $1/
     5  {
     6    @[probefunc] = count();
     7  }
     8  syscall::rexit:entry
     9  {
    10    exit(0);
    11  }

# pgrep vi
2208
# ./syscalls2.d 2208

  rexit                                               1
  setpgrp                                             1
  creat                                               1
  getpid                                              1
  open                                                1
  lstat64                                             1
  stat64                                              1
  fdsync                                              1
  unlink                                              1
  close                                               1
  alarm                                               1
  lseek                                               1
  sigaction                                           1
  ioctl                                               1
  read                                                1
  write                                               1