(※ 2016 年 2 月 14 日に Japan WDK Support Blogに公開した情報のアーカイブです。)
皆様、いかがお過ごしでしょうか。WDK サポートチームの石沢です。
今回の記事より Twitter アカウント MSDEVJP より更新をお知らせいただけることになりました!是非ご活用ください。また Twitter よりお越しの皆様、初めまして!本ブログではドライバ開発に関する記事を公開しております。今後とも何卒よろしくお願いいたします。
今回は Windows Driver Frameworks (WDF)
に関するお話しです。 去年の 3 月に WDF
のソースコードが GitHub 上に公開されました。
Windows Driver Frameworks
これにより 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 の接続手順はここでは割愛させていただきますが、これまで本ブログでもいろいろな接続方法にてご案内させていただいておりますので、ご参照ください。
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 サポートチーム 石沢 望夢