基本からデバッグまで
基本06 WinDbgの使用方法
デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
1.WinDbgとは
WinDbgは、Microsoftが開発者向けに無償で提供しているGUIベースのデバッグツールです。ユーザーモードだけでなく、カーネルモードでのデバッグにも対応しており、ドライバ開発やシステムトラブルの解析に広く利用されています。
WinDbgを使用すると、以下のような操作が可能です。
- ライブデバッグ
実行中のシステムに接続してリアルタイムで状態を確認・操作するデバッグ手法です。ブレークポイントを使って処理を一時停止し、変数の値や関数の流れをその場で調査できます。
- ダンプ解析
システムがクラッシュした際に出力されるメモリダンプファイルを後から解析する方法です。クラッシュ時の状態を再現し、原因を特定するのに役立ちます。
これらの機能は、以下のような低レベルの情報を直接確認・操作することで実現されます。
- メモリやCPUレジスタの内容調査
- アセンブリコードの確認
この講座では、ドライバのライブデバッグを開始するまでの手順を解説します。
2.WinDbgのインストール
WinDbgには実は2種類のユーザーインターフェース(UI)があります。
- WinDbg(クラシック)
- WinDbg(モダン)
※この章では説明の都合上「クラシック」「モダン」と表記していますが、実務では特に区別せずに「WinDbg」と呼ばれることが一般的です。
両者は機能的にはほとんど同じですが、WinDbg(モダン)はより洗練されたUIを備えており、操作性が向上しています。
本講座では、最新バージョンのWinDbg(モダン)の画面を使用して解説を進めますが、どちらのバージョンを使用しても構いません。お好みで選択してください。
WinDbg(クラシック)のインストール
WinDbg(クラシック)はDebugging Tools for Windowsのというパッケージに含まれています。このパッケージはWDKやSDKの一部として提供されており、基本03_環境設定で解説した手順に従っていれば、すでにインストールされてるはずです。
もしインストールされていない場合は、SDKインストーラーを用いて、Debugging Tools for Windowsを追加インストールしてください。
図1:SDKによるDebugging Tools for Windowsのインストール画面
WinDbg(モダン)のインストール
WinDbg(モダン)は単体でインストールすることができます。以下の公式ドキュメントを参考に、インストールを行ってください
WinDbg のインストール - Windows drivers | Microsoft Learn
3.ライブデバッグのための準備
3.1. 環境の設定
WinDbgを使ってカーネルモードのデバッグを行うには、以下の2台のPCが必要です。
- ホストPC:デバッグを実行する側のPC
- ターゲットPC:デバッグ対象となる側のPC(仮想マシンでも可)
ターゲットPCは、仮想マシンで問題ありません。以下のような代表的な仮想化ソフトウェアが利用可能です。本講座では、Hyper-Vを使用します。
- Hyper-V
- VirtualBox
- VMware
環境構成
- ホストPCには WinDbg をインストール
- ターゲットPCには 検証対象のドライバ をインストール
※ドライバのインストール方法については、基本05_ドライバのインストールとアインストールの講座をご参照ください。
図2:接続のイメージ図
本講座では、ネットワーク(NET)接続によるデバッグを行います。
その他にも、以下のような接続方法が利用可能です。
- COMポート接続
- USB接続
- IEEE1394接続
3.2. NET接続によるデバッグの準備
NETを使ってカーネルデバッグを行う際の基本的な流れは以下の通りです。
- ホストPCとターゲットPCがネットワーク接続をできることを確認する
- ターゲットPC側でデバッグを受け入れる設定を行う
- ホストPCでWinDbgを起動し、ターゲットPCと接続する
- ソースパスとシンボルパスを設定する
- ターゲットPCのOSを再起動する
それでは一つずつ詳細に確認します。
- ホストPCとターゲットPCがネットワーク接続をできることを確認する
両PCが同じネットワーク上にあり、通信できることを確認するため、コマンドにて、IPアドレスを確認し、接続の確認をします。IPアドレスの確認のため、それぞれのPCにてコマンドプロンプトを開き、以下のコマンドを実行します。
ipconfig ネットワーク接続の確認を以下のコマンドで行います。
- ホストPCから確認する場合
ping [ターゲットPCのIP] -S [ホストPCのIP] -
ターゲットPCから確認する場合
ping [ホストPCのIP] -S [ターゲットPCのIP] どちらも以下のような文章が出力されていれば接続は成功しています。
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失) ※ipconfigのコマンドで複数のIPアドレスが表示された場合は、それぞれのIPアドレスで通信を確認し、相互に通信可能なアドレスを選択してください。
- ターゲットPC側でデバッグを受け入れる設定を行う
管理者権限でコマンドプロンプトを起動します。そして、以下のコマンドにてデバッグモードを有効にします。
bcdedit /debug on ※仮想マシンのセキュアブートは無効にする必要があります。
続いて以下のコマンドで接続設定を行います。
bcdedit /dbgsettings NET hostip:<ホストPCのIP> port:<ホストPCのポート> // 入力例(Keyを任意で設定することもできます)
bcdedit /dbgsettings NET hostip:192.168.1.1 port:50000 key:1.1.1.1ポート番号は49152以上かつ未使用の番号を指定してください。
使用中のポートを確認するには以下のコマンドを使用します。
netstat 実行後に表示される Key をメモしておいてください(WinDbg接続時に使用します)。
- ホストPCでWinDbgを起動し、ターゲットPCと接続する
WinDbgを管理者権限で起動します。左上の「ファイル」メニューを選択します。
図3:WinDbgホーム画面
続いて、「Attach to kernel」を選択し、②で設定したポート番号、keyそしてターゲットPCのIPを入力し、OKボタンをクリックします。
図4:WinDbgファイル画面
- ソースパスとシンボルパスを設定する
「Settings」画面を開き、以下のパスを設定します。どちらも「Browse...」ボタンを押すことでフォルダを選択することができます。- Source Path:デバッグ対象のソースコードがあるフォルダ
- Symbol Path:シンボルファイル(.pdbファイル)があるフォルダ
図5:WinDbg設定画面
シンボルファイルには関数名や変数名などのデバッグ情報が含まれています。通常は、ビルドしたシステムファイルと同じフォルダにあります。
また、MicrosoftのモジュールはMicrosoftが提供するパブリックシンボルサーバーにてシンボルが公開されています。「srv*」の設定により、デバッグに必要なMicrosoftのモジュールシンボルが自動的に取得されます。
- ターゲットPCのOSを再起動する
ターゲットPCのOSを再起動します。
再起動後、WinDbgに以下のようなメッセージが表示されれば、接続は成功です。
Connected to target xxx.xx.xxx.xxx on port xxxxx on local IP xxx.xxx.x.xxx.
You can get the target MAC address by running .kdtargetmac command.
...
これで、カーネルモードのライブデバッグを行う準備が整いました。
以降は、ブレークポイントを設定して、エラー発生時の変数の値を確認するなど、アプリケーションのデバッグと同様の操作が可能になります。以下を参考にしてください。
【参考URL】
標準的なデバッグの手法 - Windows drivers | Microsoft Learn