動画:WDF ソース コードを使用したドライバーのデバッグ

このトピックには、WDF ソース コードへのフル アクセスを使用して Windows Driver Framework (WDF) ドライバーをデバッグする方法を示すチュートリアル動画が含まれています。 動画の後に続く手順は、簡単に参照するために、動画に従った手順です。

WDF ソース デバッグを使用すると、WDF ソース コードをダウンロードしなくても、フレームワーク コードに自由にステップ インできます。 デバッガーは、正しいバージョンの WDF を GitHub から自動的にダウンロードします。

たとえば、WinDbg を使用して Windows 10 コンピューターで WDF ドライバーをデバッグし、デバッガーが呼び出し履歴のフレームワーク コードで分割されている場合、呼び出し履歴ビューで WDF フレームをダブルクリックすると、WinDbg は自動的にダウンロードし、対応する行で関連する WDF ソース ファイルを開きます。 その後、コードをステップ実行してブレークポイントを設定できます。

この機能は、Windows 10 Technical Preview ビルド 10041 以降のパブリック リリースを実行しているターゲット システムで使用できます。 これらのビルドには、Microsoft パブリック シンボル サーバーで使用できる KMDF (Wdf01000.sys) と UMDF (Wudfx02000.dll) のプライベート ソースインデックス付きシンボル ファイルがあります。 WDF コードのソース レベルのデバッグは、Visual Studio デバッガーではなく、WinDbg でのみ使用できます。

クイック スタート

ターゲット コンピューターへの WinDbg カーネル デバッグ セッションを開始し、中断して、次の手順に従います。

  1. .symfix を使用して既定のシンボル パスを設定します。 これにより、シンボル サーバーを指すシンボル パスが設定されます https://msdl.microsoft.com/download/symbols

    kd> .symfix

  2. .srcfix を使用して既定のソース パスを設定します。 これはソース パスを srv* に設定し、デバッガーに SrcSrv を使用して、ターゲット モジュールのシンボル ファイルに指定された場所からソース ファイルを取得するよう指示します。

    kd> .srcfix
    Source search path is: SRV*
    
  3. .reload を使用してシンボルを再読み込みし、Wdf01000.sys シンボル (または UMDF の場合はWudfx02000.dll) がソース インデックス付けされていることを確認します。 次の !lmi の出力に示すように、Wdf01000.sys PDB はソース インデックスが作成されます。 そうでない場合は、以下の「WinDbg セットアップ」セクションを参照してください。

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. これで、すべてが設定されました。 WDF ソース コードをステップ 実行する簡単な方法は、フレームワークの IRP ディスパッチ ルーチンにブレークポイントを設定し、コードの残りの部分を読み進めることです。 Windows システムには多数の受信トレイ KMDF ドライバーがあるため、WDF は常に読み込まれて実行され、このブレークポイントはすぐにヒットします (独自のドライバーを読み込む必要はありません)。

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

これが機能しない場合は、次の WinDbg セットアップ手順をお試しください。

WinDbg のセットアップ

上記の例が期待どおりに動作しなかった場合は、以下の 1 つ以上の手順を実行する必要があります。

ソース モードのデバッグを有効にする

ソース モードでのデバッグが有効になっていることを確認します。 [デバッグ] メニューを開き、ソース モードがチェックされていることを確認します。

古いシンボル キャッシュのクリア

以前に同じ Windows ターゲットの WDF ドライバーをデバッグした場合は、ソース インデックスが作成されていないローカルにキャッシュされた WDF シンボルを使用している可能性があります。 これは、 !lmi コマンドを使用して確認できます。

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

上記の読み込みレポートによると、Wdf01000.pdb にはソース インデックスが作成されていません。 つまり、ローカルの WinDbg シンボル キャッシュが古くなっています。 これを修正するには、WinDbg から PDB をアンロードし、ローカル キャッシュをクリアし (パスは上記の !lmi 出力に基づいて異なる場合があります)、PDB を再読み込みします。

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

ここで !lmi を実行してもう一度チェックします。PDB はソース インデックスとして表示され、ソース コード ウィンドウがポップアップ表示されます。

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

WDF ソース レベルのデバッグは、ライブ デバッグとクラッシュ ダンプの分析だけでなく、IRP ディスパッチャーなどのコア関数にブレークポイントを設定し、後続のコード パスを調べることで、フレームワーク内部の詳細を学習するためにも使用できます。