次の方法で共有


DbgEng 拡張 DLL の構造

DbgEng 拡張 DLL は、多数のコールバック関数をエクスポートします。その一部は拡張コマンドの実装である可能性があります。

これらの拡張 DLL はデバッガー エンジンによって読み込まれ、Microsoft Windows でユーザー モードまたはカーネル モードのデバッグを実行しながら、追加の機能やタスクの自動化を提供できます。

Debugging Tools for Windows の完全インストールを実行した場合、「exts」という名前のサンプル DbgEng 拡張コマンドがインストール ディレクトリの sdk\samples\exts サブディレクトリに配置されます。

拡張コマンド

拡張 DLL は、拡張コマンドの実行に使用される任意の数の関数をエクスポートできます。 各関数は .def ファイル内のエクスポートとして明示的に宣言されており、その名前は完全に小文字で構成されている必要があります。

拡張コマンドの実装に使用される関数は、プロトタイプ PDEBUG_EXTENSION_CALL と一致する必要があります。

これらの関数は、大文字が許可されないことを除き、標準の C++ 規則に従って名前が付けられます。 拡張コマンドが感嘆符 (!) で始まる点を除き、エクスポートされた関数名と拡張コマンド名は同じです。 たとえば、デバッガーに myextension.dll を読み込み、Debugger Command ウィンドウに「!stack」と入力すると、デバッガーは、myextension.dll で stack という名前のエクスポートされた関数を探します。

myextension.dll がまだ読み込まれていない場合、または他の拡張 DLL に同じ名前の他の拡張コマンドがある可能性がある場合、Debugger Command ウィンドウに「!myextension.stack」と入力して、拡張 DLL とその DLL 内の拡張コマンドを示すことができます。

その他のエクスポートされた関数

DbgEng 拡張 DLL は DebugExtensionInitialize をエクスポートする必要があります。 これは、DLL が読み込まれるときに呼び出され、DLL を初期化します。 グローバル変数を初期化するために DLL によって使用される場合があります。

拡張 DLL は DebugExtensionUninitialize をエクスポートできます。 これがエクスポートされると、拡張 DLL がアンロードされる前に呼び出されます。 DLL がアンロードされる前にクリーンアップするために使用できます。

拡張 DLL は DebugExtensionNotify をエクスポートできます。 これをエクスポートすると、セッションの開始時または終了時、およびターゲットの実行の開始時または停止時に呼び出されます。 これらの通知は、クライアントに登録されている IDebugEventCallbacks オブジェクトにも提供されます。

拡張 DLL は KnownStructOutput をエクスポートできます。 これがエクスポートされると、DLL が読み込まれるときに呼び出されます。 この関数は、DLL が 1 行で印刷する方法を認識している構造体のリストを返します。 これらの構造体のインスタンスを印刷用に書式設定するために、後で呼び出すことができます。

DbgEng 拡張 DLL を読み込むためのエンジン プロシージャ

拡張 DLL が読み込まれると、コールバック関数はエンジンによって次の順序で呼び出されます。

  1. DebugExtensionInitialize は、拡張 DLL が初期化できるように呼び出されます。

  2. エクスポートされた場合、エンジンにアクティブなセッションがある場合は DebugExtensionNotify が呼び出され、セッションが中断されアクセス可能な場合は再度呼び出されます。

  3. エクスポートされた場合、KNOWNStructOutput が呼び出され、DLL が 1 行で印刷する方法を認識している構造体のリストを要求します。

デバッガーを使用して拡張 DLL の読み込みやアンロードを行う方法の詳細については、「デバッガー拡張 DLL の読み込み」を参照してください。拡張コマンドの実行の詳細については、、「デバッガ拡張コマンドの使用」を参照してください。

デバッガー エンジンは、拡張 DLL の呼び出しの周囲に try / except ブロックを配置します。 これにより、拡張コマンドのコード内のいくつかの種類のバグからエンジンが保護されます。ただし、拡張コマンドの呼び出しはエンジンと同じスレッドで実行されるため、クラッシュする可能性があります。