ドライバーでのフレームワーク オブジェクトのリークの判断
このトピックでは、未リリースの参照によってドライバーのメモリ リークが発生する方法について説明します。 これは、ユーザーモード ドライバー フレームワーク (UMDF) バージョン 1 および 2 ドライバーに適用されます。
UMDF 1
UMDF バージョン 1 では、AddRef の各呼び出しに対応する Release 呼び出しがない場合、呼び出し履歴によってメモリ リークが発生する可能性があります。
UMDF バージョン 1 ドライバーがフレームワーク オブジェクトをリークするかどうかをテストするには、次の手順を使用します。
WDF 検証ツール コントロール アプリケーションを使用して、必要な検証ツール オプションを設定します。 通常のテストでは、TrackRefCounts ではなく TrackObjects を設定することから始めます。
ドライバーがアンロードされると、フレームワーク オブジェクトが削除されていない場合、フレームワークのコード検証ツールがデバッガーに入り、!wudfdumpobjects デバッガー拡張機能を使用するように求められます。 このデバッガー拡張機能により、削除されていないオブジェクトの一覧が表示されます。
コード検証ツールが、ドライバーがフレームワーク オブジェクトをリークしていることを示す場合は、コントロール アプリケーションを使用して TrackRefCounts オプションを設定します。
このオプションが設定されている場合、検証ツールは、ドライバーの実行中にフレームワーク オブジェクトへの参照を追跡します。 !wudfrefhist デバッガー拡張機能を使用すると、オブジェクトの参照カウントをインクリメントまたはデクリメントする各呼び出し履歴 (関数呼び出しのセット) を表示できます。 これらの呼び出し履歴で AddRef 呼び出しと Release 呼び出しを調べることで、オブジェクトの参照数を減らさないためリークの原因となるスタックを見つけることができます。
追加の検証ツール オプションの詳細については、「UMDF 検証ツールの使用」を参照してください。
フレームワーク オブジェクトを削除するタイミングについては、「オブジェクトの有効期間の管理」を参照してください。
UMDF 2
UMDF バージョン 2 では、未リリースの参照はまれですが、WdfObjectReference と WdfObjectDereference の使用時に呼び出しの不一致が原因で発生する可能性があります。
UMDF バージョン 2 ドライバーがフレームワーク オブジェクトをリークするかどうかをテストするには、次の手順を使用します。
ベスト プラクティスに記載されている手順に従って、UMDF デバッグ用にコンピューターを構成します。
タグ追跡を使用するには、レジストリで UMDF 検証ツールとハンドル追跡の両方を有効にします。 これらの設定はどちらも、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WUDF\Services\<driver name> キーのドライバーの Parameters\Wdf サブキーに格納されます。
UMDF 検証ツールを有効にするには、VerifierOn にゼロ以外の値を設定します。
ハンドル追跡を有効にするには、TrackHandles の値に 1 つ以上のオブジェクト タイプを設定してそれらのオブジェクト タイプのみを追跡するようにするか、アスタリスク (*) を指定してすべてのオブジェクト タイプを追跡するようにします。
WdfVerifier.exe アプリケーションを使用して UMDF 検証ツールの設定を変更することもできます。
再起動し、デバッガー接続を確立してから、次のデバッガー コマンドを使用します。
- ハンドル階層を表示するための !wdfkd.wdfdriverinfo 0x10
- タグ情報を表示する !wdfkd.wdftagtracker
UMDF 検証ツールがオンの場合、KMDF と同様に、ドライバーのアンロード時にメモリ リークが検出されます。
KMDF ドライバーと UMDF バージョン 2 ドライバーで参照カウントを使用する方法の詳細については、「フレームワーク オブジェクトのライフ サイクル」を参照してください。