Solaris 動的トレースガイド

pid プローブの命名

pid プロバイダは、実際は、複数のプロバイダから成る「クラス」を定義します。プロセスごとに固有の pid プロバイダを関連付けることができます。たとえばプロセス ID 123 のプロセスをトレースしたい場合は、pid123 プロバイダを使用します。このようなプロバイダから提供されるプローブでは、プローブ記述のモジュール部分が、対応するプロセスのアドレス空間にロードされたオブジェクトを示します。以下は、mdb(1) を使ってオブジェクトのリストを表示する例です。


$ mdb -p 1234
Loading modules: [ ld.so.1 libc.so.1 ]
> ::objects
    BASE    LIMIT     SIZE NAME
   10000    34000    24000 /usr/bin/csh
ff3c0000 ff3e8000    28000 /lib/ld.so.1
ff350000 ff37a000    2a000 /lib/libcurses.so.1
ff200000 ff2be000    be000 /lib/libc.so.1
ff3a0000 ff3a2000     2000 /lib/libdl.so.1
ff320000 ff324000     4000 /platform/sun4u/lib/libc_psr.so.1

プローブ記述内では、ファイル名 (完全パス名ではない) でオブジェクトに名前を付けます。接尾辞 .1so.1 は省略することもできます。以下の例では、すべて同じプローブに名前を付けています。

pid123:libc.so.1:strcpy:entry
pid123:libc.so:strcpy:entry
pid123:libc:strcpy:entry

最初の例はプローブの実際の名前です。残りの 2 つの例は別名です。これらの別名は、内部で完全ロードオブジェクト名に置き換えられます。

実行可能ファイルのロードオブジェクトには、別名 a.out を使用できます。次の 2 つのプローブ記述は、同じプローブに名前を付けています。

pid123:csh:main:return
pid123:a.out:main:return

アンカーされた DTrace プローブの場合と同様に、プローブ記述の関数フィールドを使って、モジュールフィールド内の関数に名前を付けます。ユーザーアプリケーションバイナリでは、同じ関数に複数の名前が付けられていることがあります。たとえば、mutex_locklibc.so.1 内の関数 pthread_mutex_lock の代替名になります。DTrace は、このような関数に対して正規名を 1 つ選択し、これを内部で使用します。以下の例では、DTrace がモジュール名と関数名を正規の形式に再マッピングする内部手続きの様子を確認できます。


# dtrace -q -n pid101267:libc:mutex_lock:entry'{ \
    printf("%s:%s:%s:%s\n", probeprov, probemod, probefunc, probename); }'
pid101267:libc.so.1:pthread_mutex_lock:entry
^C

この自動リネームにより、有効にする前と実際に有効にしたあとで、プローブ名が若干変化することがあります。同じ Solaris リリースを実行しているシステム同士であれば、DTrace をいつ実行しても、正規名は常に同じです。

pid プロバイダの効果的な使用例については、第 33 章ユーザープロセスのトレースを参照してください。