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

!analyze 拡張機能と !owner 拡張機能では、デバッガーで検出されるシンボルの所有者を特定するために、triage.ini という名前のファイルが使用されます。

これらの拡張機能を使用すると、「Followup」という単語の後に関数またはモジュール所有者の ID が表示されます。

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

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

triage.ini ファイルの形式

triage.ini ファイルは、デバッガーに分割された関数の所有者を特定するのに役立ちますが、このファイルの「所有者」文字列は、デバッグに役立つ可能性のあるものにすることができます。 文字列には、コードを記述したユーザー または保守するユーザーの名前を指定できます。 または、モジュールまたは関数でエラーが発生したときに実行できる操作に関する簡単な説明を文字列にすることができます。

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

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

モジュール名または関数名を !owner 拡張子に渡すと、デバッガーは「フォローアップ」という単語の後にモジュールまたは関数の所有者の名前を表示します。

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

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

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

Triage.ini と !analyze

!analyze 拡張機能を使用すると、デバッガーはスタック内の最上位の障害フレームを調べて、このフレーム内のモジュールと関数の所有者の特定を試みます。 デバッガーが所有者を特定できる場合は、所有者情報が表示されます。

デバッガーが所有者を特定できない場合は、デバッガーが所有者またはスタックを完全に調べるまで、次のスタック フレームに渡されます。

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

次の例では、このトピックで前述したサンプル triage.ini ファイルを使用します。

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

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

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

デバッガーは、次の例のような出力を表示します。

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

Use !analyze -v to get detailed debugging information.

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

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

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

特別な triage.ini 構文

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

モジュール名または関数名として「default」を使用する場合は、ワイルドカード文字と同じです。 たとえば、nt!\* は nt!default と同じで、default*!\* と同じです。

一致したが、等号 (=) の右側に ignore という単語が表示される場合、デバッガーはスタック内の次のフレームに進みます。

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

サンプル triage.ini

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