この章では、「匿名トレース」と呼ばれる、DTrace コンシューマに関連付けられていないトレースについて説明します。匿名トレースは、DTrace コンシューマプロセスを実行できない場合に使用します。匿名トレースは、通常、デバイスドライバ開発者が、システムのブート時のアクティビティをデバッグしたりトレースしたりするために使用します。対話形式でトレース可能なデータは、匿名でもトレースできます。ただし、匿名有効化を作成できるのはスーパーユーザーだけです。また、複数の匿名有効化が同時に存在することはありません。
匿名有効化を作成するには、dtrace(1M) を -A オプション付きで呼び出して、必要なプローブ、述語、アクション、およびオプションを指定します。dtrace は、dtrace(7D) ドライバの構成ファイル (通常は /kernel/drv/dtrace.conf) に、要求内容に対応した一連のドライバプロパティを追加します。これらのプロパティは、ロード後、dtrace(7D) ドライバによって読み取られます。このドライバは、指定されたアクション関連の指定されたプローブを有効にし、「匿名状態」を作成して、新しい有効化に関連付けます。通常、dtrace(7D) ドライバは、DTrace プロバイダとして機能するほかのドライバと同じように、オンデマンドでロードされます。ブート中にトレースを行うためには、なるべく早い段階で dtrace(7D) ドライバをロードする必要があります。dtrace は、必要な DTrace プロバイダと自身 (dtrace(7D)) の /etc/system (system(4) のマニュアルページを参照) に、必要な forceload 文を追加します。
その後、システムがブートすると、dtrace(7D) から、構成ファイルが正常に処理されたことを示すメッセージが発行されます。
匿名有効化には、バッファーサイズ、動的変数のサイズ、投機のサイズ、投機の数など、あらゆるオプションを設定できます。
匿名有効化を削除するには、プローブ記述を指定しないで、dtrace -A を実行します。
マシンが完全にブートしたら、任意の匿名状態を要求できるようになります。このためには、-a オプションを指定して dtrace を実行します。デフォルトでは、-a は、匿名状態を要求し、既存のデータを処理し、実行を続行することを表します。匿名状態を消費して終了する場合は、-e オプションを追加します。
カーネルの匿名状態がいったん消費されてしまうと元に戻すことはできませんが、カーネル内バッファーは再利用されます。匿名トレース状態が存在しないのに、この状態を要求した場合、dtrace から次のようなメッセージが返されます。
dtrace: could not enable tracing: No anonymous tracing state |
欠落やエラーが発生した場合、dtrace は、匿名状態が要求された時点で適切なメッセージを返します。欠落やエラーを知らせるメッセージは、匿名状態のときも非匿名状態のときも同じです。
以下の例では、iprb(7D) モジュール内の各プローブを DTrace で匿名有効化します。
# dtrace -A -m iprb dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
リブート後、コンソールに、指定されたプローブを有効化していることを示す dtrace(7D) からのメッセージが出力されます。
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (:iprb::) NOTICE: enabling probe 1 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
マシンのリブートが完了したら、dtrace -a コマンドを実行して、匿名状態を消費できます。
# dtrace -a CPU ID FUNCTION:NAME 0 22954 _init:entry 0 22955 _init:return 0 22800 iprbprobe:entry 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22801 iprbprobe:return 0 22802 iprbattach:entry 0 22874 iprb_getprop:entry 0 22875 iprb_getprop:return 0 22934 iprb_get_dev_type:entry 0 22935 iprb_get_dev_type:return 0 22870 iprb_self_test:entry 0 22871 iprb_self_test:return 0 22958 iprb_hard_reset:entry 0 22959 iprb_hard_reset:return 0 22862 iprb_get_eeprom_size:entry 0 22826 iprb_shiftout:entry 0 22828 iprb_raiseclock:entry 0 22829 iprb_raiseclock:return ... |
以下の例では、iprbattach() から呼び出された関数だけに注目します。エディタで以下のスクリプトを入力し、iprb.d という名前のファイルに保存してください。
fbt::iprbattach:entry { self->trace = 1; } fbt::: /self->trace/ {} fbt::iprbattach:return { self->trace = 0; }
次のコマンドを実行します。すると、ドライバ構成ファイルの以前の設定が消去され、新しい匿名トレース要求がインストールされます。そしてリブートします。
# dtrace -AFs iprb.d dtrace: cleaned up old anonymous enabling in /kernel/drv/dtrace.conf dtrace: cleaned up forceload directives in /etc/system dtrace: saved anonymous enabling in /kernel/drv/dtrace.conf dtrace: added forceload directives to /etc/system dtrace: run update_drv(1M) or reboot to enable changes # reboot |
リブート後、コンソールに dtrace(7D) からのメッセージが出力されます。出力される有効化の情報は、前回とは若干異なっています。
... Copyright 1983-2003 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. NOTICE: enabling probe 0 (fbt::iprbattach:entry) NOTICE: enabling probe 1 (fbt:::) NOTICE: enabling probe 2 (fbt::iprbattach:return) NOTICE: enabling probe 3 (dtrace:::ERROR) configuring IPv4 interfaces: iprb0. ... |
マシンのブートが完了したら、dtrace に -a オプションと -e オプションを付けて実行します。こうすると、匿名データを消費したあとに終了します。
# dtrace -ae CPU FUNCTION 0 -> iprbattach 0 -> gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_cache_alloc 0 -> kmem_cache_alloc_debug 0 -> verify_and_copy_pattern 0 <- verify_and_copy_pattern 0 -> tsc_gethrtime 0 <- tsc_gethrtime 0 -> getpcstack 0 <- getpcstack 0 -> kmem_log_enter 0 <- kmem_log_enter 0 <- kmem_cache_alloc_debug 0 <- kmem_cache_alloc 0 <- kmem_zalloc 0 <- gld_mac_alloc 0 -> kmem_zalloc 0 -> kmem_alloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_xalloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> segkmem_alloc 0 -> segkmem_xalloc 0 -> vmem_alloc 0 -> highbit 0 <- highbit 0 -> lowbit 0 <- lowbit 0 -> vmem_seg_alloc 0 -> highbit 0 <- highbit 0 -> highbit 0 <- highbit 0 -> vmem_seg_create ... |