モジュールおよび関数所有者の指定

! Analyze および ! owner 拡張機能では、Triage.ini という名前のファイルを使用して、デバッガーが検出したシンボルの所有者を特定します。

これらの拡張機能を使用すると、関数またはモジュールの所有者の id が "フォローアップ" という単語の後に表示されます。

Triage.ini ファイルは、 \ Windows インストール用のデバッグツールのトリアージサブディレクトリに存在するテキストファイルです。 サンプル Triage.ini ファイルは、Windows パッケージのデバッグツールの一部として含まれています。

警告 最新バージョンと同じディレクトリに Windows 用デバッグツールの更新バージョンをインストールすると、そのディレクトリ内のすべてのファイル (Triage.ini を含む) が上書きされます。 サンプル Triage.ini ファイルを変更または置換した後、そのコピーを別のディレクトリに保存します。 デバッガーを再インストールした後、保存した Triage.ini を既定のバージョンにコピーできます。

Triage.ini ファイルの形式

Triage.ini ファイルは、デバッガーに分割された関数の所有者を判断するのに役立ちますが、このファイルの "owner" 文字列は、デバッグに役立つ可能性がある任意のものにすることができます。 文字列には、コードを記述または管理する人の名前を指定できます。 また、モジュールまたは関数でエラーが発生した場合に実行できる操作についての簡単な指示を文字列にすることもできます。

このファイルの各行には、次の構文があります。

Module[!Function]=Owner 

アスタリスク () は、 * モジュール名または関数名の末尾にのみ追加できます。 他の場所にある場合は、リテラル文字として解釈されます。

所有者文字列にスペースを追加することはできません。 所有者文字列にスペースが存在する場合、それらは無視されます。

構文オプションの詳細については、「特殊な Triage.ini 構文」を参照してください。

次の例は Triage.ini ファイルのサンプルを示しています。

module1=Person1
module2!functionA=Person2
module2!functionB=Person3
module2!funct*=Person4
module2!*=Person5
module3!singleFunction=Person6
mod*!functionC=Person7

Triage.ini と! 所有者

モジュール名または関数名を ! owner 拡張機能に渡すと、デバッガーによって "フォローアップ" という単語と、モジュールまたは関数の所有者の名前が表示されます。

次の例では、前のサンプル Triage.ini ファイルを使用します。

0:000> !owner module2!functionB
Followup:  Person3

ファイルによれば、"Person3" は module2! functionB を所有し、"Person4" は module2! \ functionb を所有し ます。 これらの文字列はどちらも ! owner に渡される引数と一致するため、より完全な一致が使用されます。

Triage.ini と! analyze

! Analyze拡張機能を使用すると、デバッガーはスタック内の上位のエラーフレームを参照し、このフレーム内のモジュールと関数の所有者を決定しようとします。 デバッガーが所有者を判別できる場合は、所有者情報が表示されます。

デバッガーが所有者を判別できない場合、デバッガーは次のスタックフレームにを渡します。これは、デバッガーが所有者を判断するか、スタックが完全に検査されるまで続きます。

デバッガーが所有者を判別できる場合は、"フォローアップ" という単語の後に所有者名が表示されます。 デバッガーが情報をまったく検索せずにスタック全体を検索する場合、名前は表示されません。

次の例では、このトピックで既に説明したサンプル Triage.ini ファイルを使用します。

スタック上の最初のフレームが MyModule! の関数 であるとします。 デバッガーでは、Triage.ini ファイルに MyModule が見つかりません。 次に、スタックの2番目のフレームに進みます。

2番目のフレームが module3! その他の関数であるとします。 デバッガーには module3 のエントリが表示されますが、このモジュールには他の 関数 に一致するものがありません。 次に、デバッガーは3番目のフレームに進みます。

3番目のフレームが module2! functionC であるとします。 デバッガーは最初に完全一致を検索しますが、そのような一致は存在しません。 次に、デバッガーは関数名をトリミングし、Triage.ini で module2! \ 関数を検出します。 この一致は検索を終了します。これは、デバッガーが所有者が "Person4" であると判断したためです。

デバッガーでは、次の例のような出力が表示されます。

0:000> !analyze
_******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

Probably caused by : module2 ( module2!functionC+15a )

Followup: Person4
---------

より完全な一致は、より短い一致よりも優先されます。 ただし、モジュール名の一致は、常に関数名の一致に優先されます。 Module2!! \ が Triage.ini このファイルに含まれていない場合、デバッガーは一致として module2! \ * を選択します。 Module2! functionc \ *module2 \ ! * の両方が削除された場合は、_ mod * ! functionc* が選択されています。

特別な Triage.ini 構文

感嘆符と関数名を省略した場合、または を追加 \ し た場合は、_ モジュール名の後に、そのモジュール内のすべての関数が示されます。 このモジュール内の関数も個別に指定されている場合は、より正確な指定が優先されます。

モジュール名または関数名として "default" を使用すると、ワイルドカード文字と同じになります。 たとえば、 nt! \ * は _ * nt! default * * と同じであり、既定値* ! \ * と同じです。

一致が行われても、[ 無視 ] という単語が等号 (=) の右側に表示されている場合、デバッガーはスタック内の次のフレームまで続行します。

所有者の 名前 _ の前に、 _ またはその前に追加すること ができます。 このプレフィックスを使用すると、 ! analyze を実行したときに所有者の優先度が低くなります。 デバッガーは、スタック上のより大きい値に一致する 可能性 _ があることを、スタックの下位にある明確な一致として選択します。 また、スタックの上位にある 最後 _ の一致に対して、スタックの下位にある 可能性 _ がある一致を選択します。

サンプル Triage.ini

サンプル Triage.ini テンプレートは、Windows パッケージのデバッグツールに含まれています。 このファイルには、任意のモジュールおよび関数の所有者を追加できます。 グローバルな既定値を使用しない場合は、このファイルの先頭にある 既定の = MachineOwner 行を削除します。