WDF ソースコード公開
皆様、いかがお過ごしでしょうか。WDK サポートチームの石沢です。
今回の記事より Twitter アカウント MSDEVJP より更新をお知らせいただけることになりました!是非ご活用ください。また Twitter よりお越しの皆様、初めまして!本ブログではドライバ開発に関する記事を公開しております。今後とも何卒よろしくお願いいたします。
今回は Windows Driver Frameworks (WDF) に関するお話しです。 去年の 3 月に WDF のソースコードが GitHub 上に公開されました。
これにより Windows 10 では WDF を含めたデバッグをできるようになったわけなのですが、今回はどのように設定すればソースコードデバッグできるのか具体的な手順を詳しく解説いたします。
<今回のメニュー>
- カーネルデバッグ開始
- シンボルパスとソースパスの設定
- ブレイクポイントを設定しよう
- Go!
- 上手くいかないときは
■ 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 の接続手順はここでは割愛させていただきますが、これまで本ブログでもいろいろな接続方法にてご案内させていただいておりますので、ご参照ください。
■ 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 設定されているかも確認しておきましょう。
■ 4. Go!
F5 キーを押してもよいですし、コマンドウィンドウから g コマンドを入力いただいてもやりかたは自由です! Go しましょう!
kd> g Breakpoint 0 hit Wdf01000!FxDevice::DispatchWithLock: 8a6224b0 8bff mov edi,edi |
このようにブレイクして…
ソースコードも表示されました!ついでにモジュール情報を確認すると…
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 サポートチーム 石沢 望夢