WDF ソースコード公開

皆様、いかがお過ごしでしょうか。WDK サポートチームの石沢です。

今回の記事より Twitter アカウント MSDEVJP より更新をお知らせいただけることになりました!是非ご活用ください。また Twitter よりお越しの皆様、初めまして!本ブログではドライバ開発に関する記事を公開しております。今後とも何卒よろしくお願いいたします。

今回は Windows Driver Frameworks (WDF) に関するお話しです。 去年の 3 月に WDF のソースコードが GitHub 上に公開されました。

Windows Driver Frameworks

これにより Windows 10 では WDF を含めたデバッグをできるようになったわけなのですが、今回はどのように設定すればソースコードデバッグできるのか具体的な手順を詳しく解説いたします。

 

<今回のメニュー>

  1. カーネルデバッグ開始
  2. シンボルパスとソースパスの設定
  3. ブレイクポイントを設定しよう
  4. Go!
  5. 上手くいかないときは

 

■ 1.カーネルデバッグ開始

まずはカーネルデバッガ (Windbg) を接続しましょう。今回は Windows 10 バージョン 10586に接続しています。 バージョンは Windbg 接続時に以下のように表示されますので、把握しておくとよいでしょう。  

Connected to Windows 10 10586 x86 compatible target at (Fri Feb 12 14:45:33.868 2016 (UTC + 9:00)), ptr64 FALSE

具体的な Windbg の接続手順はここでは割愛させていただきますが、これまで本ブログでもいろいろな接続方法にてご案内させていただいておりますので、ご参照ください。

Windbg に関する本ブログの記事

■ 2. シンボルパスとソースパスの設定

弊社から公開しているパブリックなシンボルおよびソースにパスを設定します。  

kd> .symfix c:\PubSymbols

kd> .sympath

Symbol search path is: srv*

Expanded Symbol search path is: SRV*c:\PubSymbols*https://msdl.microsoft.com/download/symbols

kd> .srcfix

kd> .srcpath

Source search path is: SRV*

************* Symbol Path validation summary **************

Response Time (ms) Location

Deferred SRV*

 

■ 3. ブレイクポイントを設定しよう

ここまで来たらシンボルをリロードして、ブレイクポイントを設定してみましょう。  

kd> .reload

   … 略 …

kd> bp Wdf01000!FxDevice::DispatchWithLock

kd> bl

0 e 8a6224b0 0001 (0001) Wdf01000!FxDevice::DispatchWithLock

あとはソースコードデバッグするために、Windbg が Source Mode 設定されているかも確認しておきましょう。  

clip_image002 

■ 4. Go!

F5 キーを押してもよいですし、コマンドウィンドウから g コマンドを入力いただいてもやりかたは自由です! Go しましょう!

kd> g

Breakpoint 0 hit

Wdf01000!FxDevice::DispatchWithLock:

8a6224b0 8bff mov edi,edi

 

このようにブレイクして…

clip_image004 

ソースコードも表示されました!ついでにモジュール情報を確認すると…

kd> !lmi wdf01000.sys

Loaded Module Info: [wdf01000.sys]

         Module: Wdf01000

   Base Address: 8a620000

     Image Name: Wdf01000.sys

   Machine Type: 332 (I386)

     Time Stamp: 5632d433 Fri Oct 30 11:21:39 2015

           Size: 8d000

       CheckSum: 92662

Characteristics: 102 

Debug Data Dirs: Type Size VA Pointer

             CODEVIEW 25, 7a2dc, 790dc RSDS - GUID: {98D9BFE1-DECF-41B3-BD00-9E14A54626BC}

               Age: 1, Pdb: Wdf01000.pdb

                   ?? 528, 7a318, 79118 [Data not mapped]

     Image Type: MEMORY - Image read successfully from loaded memory.

    Symbol Type: PDB - Symbols loaded successfully from image header.

                 c:\PubSymbols\Wdf01000.pdb\98D9BFE1DECF41B3BD009E14A54626BC1\Wdf01000.pdb

       Compiler: C - front end [18.10 bld 40116] - back end [18.10 bld 40116]

    Load Report: private symbols & lines, source indexed

                 c:\PubSymbols\Wdf01000.pdb\98D9BFE1DECF41B3BD009E14A54626BC1\Wdf01000.pdb

しっかりプライベートシンボルがロードされ、ソースコードも参照されていることが確認できます。  

■ 5. 上手くいかないときは

環境によっては以下のように上手くソースコードが参照されない場合があります。このような場合は、キャッシュされているシンボルを一度削除してみましょう。 

kd> !lmi wdf01000.sys

… 略 …

    Load Report: private symbols & lines, not source indexed

                 c:\PubSymbols\Wdf01000.pdb\98D9BFE1DECF41B3BD009E14A54626BC1\Wdf01000.pdb

一旦 wdf01000.sys をアンロードして…  

kd> .reload /u wdf01000.sys

Unloaded wdf01000.sys

コマンドプロンプトから、表示されたパスのシンボルファイルを削除しましょう。

CMD> del c:\PubSymbols\Wdf01000.pdb\98D9BFE1DECF41B3BD009E14A54626BC1\Wdf01000.pdb

再度シンボルをリロードすることで、ソースコード参照できるようになります!

kd> .reload wdf01000.sys

kd> !lmi wdf01000.sys

… 略 …

    Load Report: private symbols & lines, source indexed

                 c:\PubSymbols\Wdf01000.pdb\98D9BFE1DECF41B3BD009E14A54626BC1\Wdf01000.pdb

上手くいきましたでしょうか?今回はここまでとなります。

ご案内差し上げた方法を用いてWDF をソースコードデバッグできるようにすることで、フレームワークまで踏み込んだデバッグを行うことができますので、皆様も是非お試しいただけますと幸いです。

WDK サポートチーム 石沢 望夢