例 15: オブジェクト参照トレースの使用
オブジェクト参照トレースは、オブジェクトが参照または逆参照されたときにシーケンシャル スタック トレースを記録する Windows 機能です。 この機能は、クラッシュやメモリ リークにつながる可能性があるオブジェクト処理のエラーを検出するように設計されています。 これらのエラーには一貫して表示されないものもあるため検出が困難です。 詳細については、「オブジェクト参照トレース」を参照してください。
オブジェクト参照トレースは、[グローバル フラグ] ダイアログ ボックスまたはコマンド プロンプトを使用して構成できます。 次の例では、コマンド プロンプトを使用します。 オブジェクト参照トレースを構成する [グローバル フラグ] ダイアログ ボックスの使用に関する詳細については、「オブジェクト参照トレースの構成」を参照してください。
オブジェクト参照トレースは、Gflags を使用して有効、無効、構成できます。 このプロセスは次のとおりです。
Gflags を使用して、レジストリまたはカーネル フラグ (実行時) 設定としてオブジェクト参照トレースを有効にします。 レジストリに設定を追加する場合、トレースを開始するにはコンピューターを再起動する必要があります。 設定の実行時バージョンを有効にした場合、トレースはすぐに開始されますが、コンピューターをシャットダウンまたは再起動すると、トレース設定はレジストリ キーの設定に戻ります。
疑わしいオブジェクトを作成するプロセスを開始します。 トレースには、トレースの開始後に開始したプロセスによって作成されたオブジェクトのみが含まれます。 再起動中または再起動後すぐにプロセスが開始される場合は、レジストリにトレース設定を追加してから、システムを再起動します。
トレースを表示するには、 !obtrace debugger 拡張機能 を使用します。 既定では、トレースはオブジェクトが破棄されるまで維持されますが、/p パラメーターを使用すれば、トレースが無効になるまでトレースを維持できます。
Gflags を使用して、レジストリまたはカーネル フラグ (実行時) 設定としてオブジェクト参照トレースを無効にします。 レジストリから設定を削除する場合、トレースを終了するにはコンピューターを再起動する必要があります。 設定の実行時バージョンを無効にした場合、トレースはすぐに終了されますが、コンピューターをシャットダウンまたは再起動すると、トレース設定はレジストリの設定に戻ります。
これらの例では、Gflags を使用してオブジェクト参照トレースを有効または無効にする方法を示します。 \
実行時トレースを有効にする
次のコマンドは、コマンド プロンプトでオブジェクト参照トレースを有効にします。 このコマンドでは、/ko パラメーターを使用して、オブジェクト参照トレースをカーネル フラグ (実行時) 設定として有効にします。 このコマンドでは、/t パラメーターを使用して、プール タグ Tag1 と Fred を指定します。 その結果、Tag1 または Fred で作成されたすべてのオブジェクトがトレースされます。
gflags /ko /t Tag1;Fred
コマンドによってカーネル フラグ (実行時) の設定が変更されるため、オブジェクト参照トレースはすぐに開始されます。 このトレースには、コマンドの送信後に開始したプロセスによって作成されたプール タグ Tag1 または Fred のあるすべてのオブジェクトが含まれます。
Gflags は、次のメッセージを出力して応答します。
Running Kernel Settings :
Object Ref Tracing Enabled
Temporary Traces
Pool Tags: Tag1;Fred
Process Name: All Processes
このメッセージは、オブジェクト参照トレースが有効になっていることを示します。 「一時的なトレース」は、オブジェクトが破棄されるときにトレースのすべての記録が削除されることを示します。 トレースを「永続的」に設定するには、/p パラメーターを使用し、オブジェクト参照トレースが無効になるまで、またはコンピューターがシャットダウンまたは再起動されるまで、トレース データを保持するように Windows に指示します。
レジストリでトレースを有効にする
次のコマンドは、オブジェクト参照トレース構成をレジストリに追加します。 構成したトレースは、コンピューターの再起動時に開始されます。
このコマンドでは、/ro パラメーターを使用して、オブジェクト参照トレースをレジストリ設定として有効にします。 このコマンドでは、/i を使用して notepad.exe のプロセスを指定し、/t パラメーターを使用してプール タグ Tag1 および Fred を指定します。 その結果、Tag1 または Fred のプール タグのあるメモ帳プロセスで作成されたすべてのオブジェクトがトレースされます。 このコマンドでは、/p パラメーターを使用して、トレースが無効になるまでトレース データを保持することもできます。
gflags /ro /t Tag1;Fred /i Notepad.exe /p
コマンドを送信すると、Gflags がレジストリに情報を格納します。 ただし、コンピューターを再起動するまでレジストリ設定が有効ではないため、このオブジェクト参照トレースは構成されていますが、まだ開始されません。
Gflags は、次のメッセージを出力して応答します。
Boot Registry Settings :
Object Ref Tracing Enabled
Permanent Traces
Pool Tags: Tag1;Fred
Process Name: Notepad.exe
このメッセージは、レジストリでオブジェクト参照トレースが有効になっていることを示します。 「永続的なトレース」は、コンピューターをシャットダウンまたは再起動するまでトレース データが保持されることを示します。 このメッセージには、トレースされるプール タグとイメージ ファイル名も一覧表示されます。
オブジェクト参照トレース構成を表示する
現在有効になっているオブジェクト参照トレースや、コンピューターの再起動時に使用するレジストリに格納されているオブジェクト参照トレース構成を表示できます。
この例では、レジストリに格納されているオブジェクト参照トレース構成と、実行時用に構成された別のオブジェクト参照トレース構成が 1 個ずつあります。 実行時トレースはすぐに開始されます (さらにレジストリ設定を上書きします)。 ただし、システムを再起動すると、実行時の設定は失われ、オブジェクト参照トレース セッションのレジストリ設定が有効になります。
次のコマンドは、実行時のオブジェクト参照トレース構成を表示します。 ここでは、他にパラメーターがなく /ko パラメーターを使用します。
gflags /ko
Running Kernel Settings :
Object Ref Tracing Enabled
Temporary Traces
Pool Tags: Tag1;Fred
Process Name: All Processes
この例のようにオブジェクト参照トレースが有効になっている場合、表示される設定は進行中のトレースを表しています。
次のコマンドは、レジストリのオブジェクト参照トレース構成格納データを表示します。 ここでは、他にパラメーターがなく /ro パラメーターを使用します。
gflags /ro
これに対して、Gflags はレジストリの格納データを表示します。
Boot Registry Settings :
Object Ref Tracing Enabled
Permanent Traces
Pool Tags: Tag1;Fred
Process Name: Notepad.exe
オブジェクト参照トレース構成をレジストリに追加してからコンピューターを再起動した場合、gflags /ro コマンドに対して表示される設定は、進行中のトレースを表しています。 ただし、まだ再起動していない場合、または再起動した場合に実行時オブジェクト参照トレース (/ko) を開始すると、現時点ではレジストリに格納されている設定は有効ではありませんが、システムを再起動すると再び有効になります。
オブジェクト参照トレースを無効にする
実行時 (カーネル フラグ) オブジェクト参照トレースの設定を無効にすると、トレースはすぐに停止します。 レジストリでオブジェクト参照トレースの設定を無効にした場合、コンピューターを再起動するとトレースが停止します。
次のコマンドは、実行時オブジェクト参照トレースを無効にします。 /d パラメーターを使用すると、すべての設定を無効にします。 選択的に設定を無効にすることはできません。
gflags /ko -d
コマンドが成功すると、Gflags は次のメッセージで応答します。
Running Kernel Settings :
Object Ref Tracing Disabled
次のコマンドは、実行時オブジェクト参照トレースを無効にします。
次のコマンドは、レジストリのオブジェクト参照トレースの設定を無効にします。 /d パラメーターを使用すると、すべての設定を無効にします。 選択的に設定を無効にすることはできません。 このコマンドは、コンピューターを再起動すると有効になります。
gflags /ro -d
コマンドが成功すると、Gflags は次のメッセージで応答します。
Boot Registry Settings :
Object Ref Tracing Disabled