プローブ・ポイント指定
プローブ・ポイント指定は 1 つ以上のプローブ・ポイント組で構成されます。
それぞれのプローブ・ポイント組は、その実行でプローブ・アクションをトリガーするコード・ロケーション、またはその発生でプローブ・アクションをトリガーするイベントを表します。 Vue 節の先頭にプローブ・タプルのコンマ区切りリストを指定することにより、複数のプローブ・ポイントを同じプローブ・アクションのセットと述部 (ある場合) に関連付けることができます。
以下に、サポートされるプローブ・タイプの例をいくつか示します。
- ユーザー関数エントリー・プローブ (uft プローブ)
- システム・コール・エントリー・プローブまたは終了プローブ (syscall プローブ)
- 特定の時間間隔で起動するプローブ (interval プローブ)
サポートされるプローブ・タイプの完全なリストについては、プローブ・マネージャーのセクションを参照してください。
プローブ・ポイント組は、プローブ・ポイントを一意的に識別する、コロンで区切られたフィールドの番号付きリストです。 この形式は次のとおりです。ただし、通常、ロケーション・フィールドは、プローブ・ポイントがプローブ・ロケーションである場合のみ指定されます。
@@ <probetype>:
<one or more probetype-specific fields separated by colons>:<location>
プローブ・マネージャーは、プローブ・ポイント組のプローブ型固有フィールドの許容値とプローブ組の長さを定義します。 ただし、プローブ・マネージャーは、プローブ・ポイント組を定義する際に以下の一般ルールに従います。
- それぞれのプローブ・ポイント組は、少なくとも 3 組である。すなわち、最低 3 フィールドが必要です。
- 最初のフィールドは必ずプローブ・タイプ (すなわち、そのプローブ・マネージャー) を表す。
- プロセス固有のトレースをサポートするプローブ・マネージャーでは、2 番目のフィールドはプロセス ID でなければならない。
- 関数のエントリー・プローブまたは終了プローブをサポートするプローブ・マネージャーでは、ロケーション・フィールド (最後のフィールド) で entry または exit キーワードを使用しなければならない。
- フィールドはコロン (:) 記号で区切る。
- プローブ・ポイント組のフィールドのアスタリスク (*) 記号は、そのフィールドに指定可能なすべての値と一致することを表します。 例えば、syscall プローブ・マネージャーでは、特定のプロセスのシステム・コール、およびすべてのプロセスのシステム・コールをプローブできます。 前者の場合、2 番目のフィールドは、プローブされるプロセスのプロセス ID でなければなりません。 後者の場合、すべてのプロセスをプローブするには、2 番目のフィールドは (*) 記号でなければなりません。 フィールドに対してアスタリスク記号が再び使用される場合は、既存スクリプトとのバイナリー互換性が保持されながら、より細かいプローブが今後許可されます。 例えば、uft プローブ・マネージャーでは、現在 3 番目のフィールドがアスタリスクでなければなりません。 将来的に、3 番目のフィールドにモジュール名がサポートされ、そのモジュールに定義された関数のみにプローブを限定できます。
- プローブ指定の最大長は 1023 文字です。
次に例を示します。
- @@uft:34568:*:foo:entry
- ID が 34568 のプロセスでの foo と呼ばれる任意の関数へのエントリーのプローブ。 3 番目のフィールドにあるアスタリスクは、foo 関数がプロセスの任意のモジュールに存在する場合にプローブされることを示します。
- @@syscall:*:read:exit
- read システム・コールの終了のプローブ。 アスタリスクは、すべてのプロセスの read システム・コールがプローブされることを示します。
- @@interval:*:clock:500
- 500 ミリ秒 (壁時計時刻) ごとに起動するプローブ。 アスタリスクは、将来的により細かいプローブ・ポイントをサポートするためのプレースホルダーです。
プロセスのプロセス ID は、多くの場合、 Vue スクリプトの作成時には認識されません。 Vue は、プローブ指定の 2 番目のフィールドまたは Vue スクリプトの任意の場所 (例えば、述部セクション) にプロセス ID をハードコーディングする必要を回避するための簡単な方法を提供します。
単一の Vue スクリプトには、ユーザー・スペース内およびカーネル内の複数のプロセスからのプローブ・ポイントを含めることができます。 生成されたトレース出力は、常に時間順に表示されます。
Vue は、プローブ・マネージャーによって定義される通常のプローブ・ポイントに加えて、2 つの特殊なプローブ・ポイントをサポートします。 各 Vue スクリプトに @@BEGIN プローブ・ポイントと @@END プローブ・ポイントを含めることができ、@@BEGIN プローブ・ポイントはプローブを使用可能にする前に実行する必要があるアクションを示し、@@END プローブ・ポイントはトレースが終了した後に実行するアクションを示します。
アクション・ブロック
アクション・ブロックは、関連したプローブ・ポイントがトリガーされたときに実行するトレース・アクションを表します。 サポートされるアクションはトレース・データの収集とフォーマット設定に制限されませんが、 Vue 言語のすべての機能を使用できます。
Vue のアクション・ブロックは、プロシージャー型言語のプロシージャーに似ています。 これは順番に実行されるステートメントのシーケンスで構成されます。 実行のフローは基本的に順次です。 例外として、「if-else」ステートメントを使用した条件付き実行が可能となり、「return」ステートメントを使用してアクション・ブロックから制御が戻されます。 Vue は、スクリプト全体を終了してトレース・セッションを終了する exit 関数もサポートします。 Vue および C 言語ステートメントにはループの構成体がないため、「for」、「do」、「goto」などはサポートされません。
プロシージャー型言語のプロシージャーとは異なり、 Vue のアクション・ブロックには出力値も戻り値もありません。 また、一連の入力パラメーターに対する固有のサポートもありません。 その一方で、アクション・ブロック内で、プローブが開始されるポイントにあるコンテキスト・データにアクセスできます。 例えば、プローブ・ポイントが関数のエントリー・ポイントにある場合、関数に渡されるパラメーターは、 Vue 節のアクション・ブロック内で参照できます。
述部
プローブ・ポイントの節の実行を条件付きで行う必要がある場合は、述部を使用します。 述部セクションは、プローブ指定セクションの直後に when キーワードがあるかどうかによって識別されます。 述部自体は、通常の C 形式の条件式と括弧で構成されます。
when ( <condition> )when ( __pid == 1678 )