フィルタを定義する式と、メモリーオブジェクトインデックスを算出するために使用される式には、共通の文法が使用されます。
文法では、式を演算子とオペランドまたはキーワードの組み合わせとして指定します。フィルタの場合は、式が真と評価されるとパケットが包含され、式が偽と評価されるとパケットが除外されます。メモリーオブジェクトまたはインデックスオブジェクトの場合、式は、パケット内で参照される特定のメモリーオブジェクトまたはインデックスオブジェクトを定義するインデックスへと評価されます。
式のオペランドにはラベル、定数、またはデータレコード内のフィールドのリストとして、describe コマンドで指定できます。オペランドには、THRID、LWPID、CPUID、USTACK、XSTACK、MSTACK、LEAF、VIRTPC、PHYSPC、VADDR、PADDR、DOBJ、TSTAMP、SAMPLE、EXPID、PID、またはメモリーオブジェクトの名前が含まれます。オペランドの名前は大文字と小文字が区別されません。
USTACK、XSTACK、および MSTACK は、それぞれユーザー表示、上級表示、マシン表示の関数呼び出しスタックを表します。
VIRTPC、PHYSPC、VADDR、および PADDR は、ハードウェアカウンタプロファイリングまたは時間プロファイリングで「+」が指定された場合のみゼロ以外になります。さらに、VADDR は、実際の仮想アドレスが決定できなかった場合、256 未満になります。VADDR を決定できなかった場合、または、仮想アドレスを物理アドレスにマップできなかった場合、PADDR はゼロになります。同様に、バックトラッキングが失敗した場合、または要求されなかった場合、VIRTPC はゼロになり、VIRTPC がゼロか、VIRTPC が物理アドレスにマップできなかった場合、PHYSPC はゼロになります。
演算子は、C の表記法と C の優先順位規則に従った通常の論理演算子と算術 (シフトを含む) 演算子、要素が集合に含まれるかどうかを決める演算子 (IN)、要素集合の一部または全部が 1 つの集合に含まれるかどうかを決める演算子 (それぞれ、SOME IN か IN) のいずれかです。追加の演算子 ORDERED IN は、左側のオペランドの全要素が、右側のオペランドに同じ順序で現れているかどうかを判断します。IN 演算子は、左側のオペランドの全要素が右側のオペランドに現れることを要求しますが、順序については強制しません。
If-then-else 構造は、C のように ? 演算子と : 演算子で指定されます。すべての式が正しく構文解析されるよう、括弧を使用してください。er_print のコマンド行では、複数の行にまたがって式を分割することはできません。スクリプト内またはコマンド行では、式に空白文字が含まれる場合、その式を二重引用符で囲む必要があります。
フィルタ式はブール値がパケットを包含する場合は真、除外する場合は偽と評価します。スレッド、CPU、実験 id、プロセス pid、および標本のフィルタリングは、適切なキーワードと 1 つの整数の間の関係式、または IN 演算子とコンマ区切りの整数リストを使用した関係式に基づきます。
時間フィルタリングを使用するには、TSTAMP と時間を結び付ける 1 つ以上の関係式を指定し、時間は、現在パケットが処理されている実験の開始以降のナノ秒数 (整数) で指定します。標本の時間を取得するには、overview コマンドを使用します。overview コマンドでは時間が秒単位で与えられるため、時間フィルタリングに使用するには、ナノ秒に変換する必要があります。時間は、パフォーマンスアナライザの「タイムライン」表示から取得することもできます。
関数フィルタリングは、リーフ関数に基づいて行うか、スタック内の任意の関数に基づいて行うことができます。リーフ関数によるフィルタリングは、LEAF キーワードと整数関数 ID の間の関係式、または IN 演算子と構造 FNAME(" regexp") を使用した関係式を使用することで指定されます (regexp は regexp(5) のマニュアルページで説明されている正規表現)。name の現在の設定で指定されている関数の名前全体が一致する必要があります。
呼び出しスタック内の関数に基づいたフィルタリングは、構造 FNAME("regexp") 内の関数が、式 (FNAME("myfunc") SOME IN USTACK) を使用してキーワード USTACK で表現された関数配列に含まれるかどうかを判定することによって指定されます。FNAME は、スタックのマシン表示 (MSTACK) および上級表示 (XSTACK) を同じ方法でフィルタリングするためにも使用できます。
データオブジェクトのフィルタリングは、スタック関数のフィルタリングに似ていて、DOBJ キーワードと構造 DNAME("regexp") を括弧で囲んで使用します。
メモリーオブジェクトのフィルタリングを指定するには、mobj_list コマンドに示すようなメモリーオブジェクトの名前とオブジェクトの整数インデックス、または一連のオブジェクトのインデックスを使用します。(<Unknown> メモリーオブジェクトのインデックスは -1 です)。
インデックスオブジェクトのフィルタリングを指定するには、indxobj_list コマンドに示すようなインデックスオブジェクトの名前とオブジェクトの整数インデックス、または一連のオブジェクトのインデックスを使用します。(<Unknown> インデックスオブジェクトのインデックスは -1 です)。
データオブジェクトのフィルタリングとメモリーオブジェクトのフィルタリングは、データ領域データを持つハードウェアカウンタパケットについてのみ意味があり、ほかのすべてのパケットは、そのようなフィルタリングでは除外されます。
仮想アドレスまたは物理アドレスの直接フィルタリングを指定するには、VADDR または PADDR とアドレスの間の関係式を使用します。
メモリーオブジェクトの定義 (mobj_define mobj-type index-expを参照) では、VADDR キーワードまたは PADDR キーワードのどちらかを使用して整数インデックスに評価する式を使用します。それらの定義は、メモリーカウンタとデータ領域データについてのハードウェアカウンタパケットにのみ適用できます。この式は整数か、または <Unknown> メモリーオブジェクトの場合は -1 を返すべきです。
インデックスオブジェクトの定義 (indxobj_define indxobj-type index-expを参照) では、1 つの整数インデックスに評価する式が使用されます。この式は整数か、または <Unknown> インデックスオブジェクトの場合は -1 を返す必要があります。
このセクションでは、er_print -filters コマンドとともに使用でき、「拡張カスタムフィルタ」ダイアログボックスで使用できるフィルタ式の例を示します。
er_print -filters コマンドでは、フィルタ式は、次の例のように単一引用符で囲まれます。
er_print -filters 'FNAME("myfunc") SOME IN USTACK' -functions test.1.er使用例 4 名前とスタックによる関数のフィルタリング
ユーザー関数スタックから myfunc という名前の関数をフィルタリングするには、次のようにします。
FNAME("myfunc") SOME IN USTACK
使用例 5 スレッドと CPU によるイベントのフィルタリングCPU 2 上でのみ実行したスレッド 1 からのイベントを表示するには、次のようにします。
THRID == 1 && CPUID == 2
使用例 6 インデックスオブジェクトによるイベントのフィルタリングインデックスオブジェクト THRCPU が "CPUID<<16|THRID" として定義されている場合、次のフィルタは、CPU 2 上で実行したスレッド 1 からのイベントを表示する場合のフィルタと等価です。
THRCPU == 0x10002
使用例 7 指定の時間内に発生したイベントのフィルタリング5 秒と 9 秒の間に発生した実験 2 のイベントをフィルタリングするには、次のようにします。
EXPID==2 && TSTAMP >= 5000000000 && TSTAMP < 9000000000
使用例 8 特定の Java クラスのイベントのフィルタリングスタック内の特定の Java クラスのメソッドを持つイベントをフィルタリングするには、次のようにします。(ユーザー表示モードの場合)
FNAME("myClass.*") SOME IN USTACK
使用例 9 内部関数 ID と呼び出し順序によるイベントのフィルタリング関数 ID が既知である (パフォーマンスアナライザに表示されている) 場合、マシン呼び出しスタック内の特定の呼び出し順序を含むイベントをフィルタリングするには、次のようにします。
(314,272) ORDERED IN MSTACK
使用例 10 状態または期間によるイベントのフィルタリングdescribe コマンドにより、時間プロファイリング実験の次のプロパティーが一覧表示された場合は、
MSTATE UINT32 Thread state NTICK UINT32 Duration
次のフィルタを使用して、特定の状態のイベントを選択できます。
MSTATE == 1
または、次のフィルタを使用して、特定の状態にあり、期間が 1 クロック刻みより長いイベントを選択できます。
MSTATE == 1 && NTICK > 1