デバッガーと Logexts.dll の使用
ロガーをアクティブにする方法の 1 つは、CDB または WinDbg を起動し、通常どおりユーザー モードのターゲット アプリケーションにアタッチすることです。 その後、!logexts.logi または !logexts.loge 拡張機能コマンドを使用します。
これにより、ターゲット アプリケーション プロセスで Logexts.dll を読み込んで初期化するルーチンにジャンプするコードが、現在のブレークポイントに挿入されます。 これは、"ターゲット アプリケーションへのロガーの挿入" と呼ばれます。
このモジュールはデバッガー拡張 DLL であり、ターゲット アプリケーションに挿入されるプログラムでもあるため、実際には Logexts.dll のインスタンスが 2 つ実行されます。 Logexts.dll のデバッガー インスタンスとターゲット インスタンスは、出力ファイル ハンドル、現在のカテゴリ マスク、およびログ出力バッファーへのポインターを含むメモリの共有セクションを介して通信します。
ターゲット アプリケーションへのアタッチ
デバッガーをターゲット アプリケーションにアタッチする方法については、「WinDbg を使用したユーザー モード プロセスのデバッグ」または「CDB を使用したユーザー モード プロセスのデバッグ」を参照してください。
ロガーの拡張機能コマンドの使用
各拡張機能の完全な構文については、それぞれのリファレンス ページを参照してください。
!logexts.logi
ロガーをターゲット アプリケーションに挿入します。 これによりログが初期化されますが、有効にはなりません。
!logexts.loge
ログ記録を有効にします。 logexts.logi が使用されていない場合、この拡張機能はログを初期化し、有効にします。
!logexts.logd
ログを無効にします。 これにより、プログラムが自由に実行できるようにするために、すべての API フックが削除されます。 COM フックは自由に再度有効にすることができないため、削除されません。
!logexts.logo
出力オプションを表示または変更します。 デバッガーに直接送信されるメッセージ、テキスト ファイル、.lgv ファイルの 3 種類の出力が可能です。 .lgv ファイルは他の 2 つよりも多くの情報を含んでおり、LogViewer で読むことができます。
テキスト ファイルの出力を無効にしても、サイズが 0 の .txt ファイルが作成されます。 これにより、同じ場所に以前に保存されたテキスト ファイルが上書きされる可能性があります。
!logexts.logc
使用可能な API カテゴリを表示し、どのカテゴリがログに記録され、どのカテゴリが記録されないかを制御し、任意のカテゴリに含まれる API を表示します。
カテゴリが無効になっている場合、そのカテゴリ内のすべての API のフックが削除されるため、パフォーマンスのオーバーヘッドはなくなります。 COM フックは自由に再度有効にすることができないため、削除されません。
特定のカテゴリのみを有効にすることは、プログラムが Windows と行っている特定の種類の対話 (ファイル操作など) にのみ関心がある場合に便利です。 これにより、ログ ファイルのサイズが小さくなり、ロガーがプロセスの実行速度に与える影響も軽減されます。
!logexts.logb
現在の出力バッファーを表示またはフラッシュします。 パフォーマンスに関する考慮事項として、ログ出力は、出力バッファーがいっぱいの場合にのみディスクにフラッシュされます。 既定では、バッファーは 2,144 バイトです。
バッファー メモリは、ターゲット アプリケーションによって管理されるため、ターゲット アプリケーションにおけるアクセス違反またはその他の回復不能なエラーがある場合は、ディスク上のログ ファイルへのバッファーの自動書き込みは発生しません。 このような場合は、このコマンドを使用してバッファーをディスクに手動でフラッシュする必要があります。そうしないと、最後にログに記録された API がログ ファイルに現れない可能性があります。
!logexts.logm
モジュールの包含/除外リストを表示または作成します。 多くの場合、特定のモジュールまたはモジュール セットから行われた API 呼び出しのみをログに記録することが望まれます。 これを容易にするために、ロガーを使用してモジュール包含リストまたはモジュール除外リストを指定することができます。 たとえば、1 つか 2 つのモジュールからの呼び出しのみをログに記録する場合は、包含リストを使用します。 すべてのモジュールからの呼び出しをログに記録するのではなく、少数のモジュールを除外する場合は、除外リストを使用します。 ロガーではそれ自体をログに記録することは許可されていないため、Logexts.dll モジュールと Kernel32.dll モジュールは常に除外されます。