Stack タグ
Windows® Performance Analyzer (WPA) のスタック タグ機能を使用して、コール スタックのどの部分が影響を受けているのかをより正確に特定するのに役立つラベル (タグ) を作成できます。
スタック タグとスタック フレーム タグの違いについて
スタック (フレーム タグ) と スタック タグは、[スタック] 列で使用できる同じデータの 2 つのビューと見なすことができます。 ビュー エディターでスタック列をスタック タグまたはスタック列 (フレーム タグ) として表示するように構成できます。
コール スタックは、フレームのリストで構成されています。 コール スタックが A -> B -> C の形式である場合、A、B、 C という 3 つのフレームがあることになります。スタック列 (フレーム タグ) はすべてのコール スタック フレームをタグにマップするか、タグが存在しない場合は既定の module!method にマップします。
たとえば、コール スタック A -> B -> C-> D はスタック (フレーム タグ) ビューで A -> FrameTagB -> FrameTagC -> D のようになります。各フレーム タグには、*.stacktags ファイルのタグの定義の階層に基づいた階層を使用できます (たとえば、FrameTagB の実際の値を「HTML\Script\OM」にすることができます)。
スタック タグは、単一のタグ名を使用して、コール スタック全体を要約します。 たとえば、タグに優先順位が指定されていない限り、通常、最下位にマップされたフレーム タグがスタック タグになります。 同じ A -> B -> C -> D の例を使用すると、フレーム タグ ビューは A -> FrameTagB -> FrameTagC -> D になり、スタック タグ ビュー,は単に FrameTagC になります。
完全に一致するモジュールとメソッドの通常のタグに加えて、HintOperator を呼び出し先または呼び出し元として HintTag を定義することもできます。 たとえば、HintOperator が呼び出し先として指定されている HintTag が B に対して定義されているとします。コール スタック A -> B -> C -> D は スタック (フレーム タグ) ビューで A -> FrameTagB -> ModuleOfC -> D にすることができ、その StackTag ビューは FrameTagB -> ModuleOfC になります。 C のモジュールは、新しいスタック タグとして動的に作成されます。 HintTag の Onlyshowmodule 属性を明示的に false に設定すると、C は ModuleOfC ではなく新しいスタック タグとして使用されます。 OnlyShowModule 属性は、既定で true に設定されています。 一般的なユースケースは、RPC サーバーの機能に自動的に属性を設定する場合です。 直接呼び出し関数は rpcrt4.dll!Invoke_epilog1_start です。 これを実現するために、この共通呼び出し元関数に HintTag を定義できます。
ヒント タグを定義して共通の関数のコストを特定する
通常、スタック タグ列は、1 つのモジュール内の 1 つの関数のコストを示します。 ただし、ヒント タグとヒント演算子を定義した場合、WPA はその関数によって呼び出されたすべての関数のコストを統合できます。 ヒント タグは、共通の関数とそれが呼び出す関数のグループのラベルであり、ヒント演算子は、呼び出し元の関数、呼び出し元、または呼び出された関数 (呼び出し先) として共通の関数を識別します。
一般的なユースケースでは、WPA が RPC サーバーの機能に自動的に属性を設定するようにヒント タグを定義します。 また、ヒント タグを定義して、ロック ホルダーやヒープを割り当てている関数を表示することもできます。
ヒント タグの定義
ヒント タグとヒント演算子は、次の表に示されている属性と値を使用して、次の構文内に XML で定義されています。
<HintTag
Name="string-label"
Priority="integer"
HintOperator="caller-or-callee"
OnlyShowModule="Boolean">
<Entrypoint
Module="module-name"
Method="method-name">
</HintTag>
要素 | 属性 | 説明 |
---|---|---|
HintTag | 名前 | ラベルとして使用する文字列 |
Priority | 整数。 既定値は (ゼロ) です。 | |
HintOperator | 呼び出し元または呼び出し先関数の値は、それぞれ「Caller」または「Callee」になります。 | |
OnlyShowModule | ブール値、省略可能。 既定値は true です。 | |
エントリ ポイント | Module | メソッドを含むモジュールの名前。 |
方法 | エントリ ポイントであるメソッドの名前。 |
XML ファイルで定義したヒント タグを追加するには、このトピックで後述する「スタックタグの定義ファイルにスタックタグを追加する」の手順に従います。
ヒント タグの使用例
次の図に示すデータの例を考えてみましょう。
この例では、WbemCore.dll で、次の4つの RPC 関数が呼び出されます。
- CWbemLevel1Login::NTLMLogin
- CWbemNamespace::GetObjectW
- CWbemNamespace::PutInstance
- CWbemNamespace::ExecMethod
これらの関数の呼び出しのコストを統合できるため、RPC サーバー側関数のコストを判別するのに役立ちます。これは、WPA の [スタック タグ] 列に合計コストが RPC として表示されるためです。
ヒント タグ RPC のエントリ ポイントとして定義されたrpcrt4.dll!Invoke 関数と、呼び出し先として指定されたヒント演算子を使用して、WPA は rpcrt4.dll!Invoke を RPC で表し、wbemcore.dll!CWbemLevel1Login::NTLMLogin を RPC\wbemcore.dll\CWbemLevel1Login::NTLMLogin で表します。 このため、WPA の [スタック タグ] 列に、RPC サーバー側関数の wbemcore.dll!CWbemLevel1Login::NTLMLogin のコストが 31.855774ms と表示されます。 WbemCore.dll では、呼び出された関数の階層で最上位の RPC 関数は NTLMLogin です。
ヒント タグ RPC は、次の XML によって定義されます。
<HintTag Name="RPC" HintOperator="Callee">
<Entrypoint Module="rpcrt4.dll" Method="Invoke"/>
</HintTag>
スタック タグ定義ファイルにスタック タグを追加する
スタック タグ定義ファイルにスタック タグ定義を追加するには、次の手順を実行します。
メニューから、[トレース]、[トレースプロパティ] を選択します。 [トレース プロパティ] タブが開きます。
[Stack Tags Definition (スタック タグの定義)] 領域で、[追加] をクリックして目的の場所に移動します。
スタック タグ ファイルが含まれている領域に移動して選択し、[開く] をクリックします。
スタック タグ定義ファイルからスタック タグを削除する
スタック タグ定義ファイルからスタック タグ定義を削除するには、次の手順を実行します。
メニューから、[トレース]、[トレースプロパティ] を選択します。 [トレース プロパティ] タブが開きます。
[Stack Tags Definition (スタック タグの定義)] 領域で、削除するスタック タグの定義を選択し、[削除] をクリックします。
警告 削除するスタック タグ定義を選択していることを確認してください。一度 [削除] を押すと、取り消すことはできなくなります。
スタック タグ定義ファイルを再読み込みする
スタック タグ定義ファイルにスタック タグ定義を再読み込みするには、次の手順を実行します。
メニューから、[トレース]、[トレースプロパティ] を選択します。 [トレース プロパティ] タブが開きます。
[Stack Tags Definition (スタック タグの定義)] 領域で、[再読み込み] をクリックします。 複数のスタック タグを読み込むには、Shift キーを押しながら各スタック タグの定義を左クリックします。
スタック タグ ファイルのトラブルシューティング
WPA でスタック タグ ファイル内の問題を調査するには、次の手順を実行します。
メニューで [ウィンドウ] をクリックし、[診断コンソール] を選択します。 WPA のディスプレイは 2 つに分割されており、画面の上半分には [グラフ エクスプローラー] と [分析] が表示され、画面の下半分には [診断コンソール] が表示されます。
ヒント WPA の左下隅にある [診断コンソール] をクリックして診断コンソールにアクセスすることもできます。 開いた後は、別のウィンドウにドラッグしたり、上部または側にドッキングしたりすることもできます。
診断コンソールには、分析ワークフロー中に発生する例外に関する情報が一覧表示されます。 シンボル デコードの問題は、このコンソールから診断できます。