Windows デバッグの概要

この記事では、Windows デバッグを開始する方法について説明します。 デバッガーを使用してクラッシュ ダンプを分析することが目的の場合は、「WinDbg を使用してクラッシュ ダンプ ファイルを分析する」を参照してください。

Windows デバッグを開始するには、次のステップを実行します。

1. ホスト システムとターゲット システムを特定する

デバッグでは通常、2 つの個別のコンピューター プロセッサが使用されます。その理由は、プロセッサ上での命令の実行が一般的にプロセス中に一時停止されるためです。 デバッガーは "ホスト" システムで実行され、デバッグするコードは "ターゲット" システムで実行されます。

ホスト <--------------------------------------------------> ターゲット

Diagram illustrating the connection between host and target systems with a double arrow.

状況によっては、仮想マシンを 2 番目のシステムとして使用できます。 たとえば、仮想 PC は、デバッグする必要があるコードと同じ PC 上で実行することもできます。 ただし、コードが低レベルのハードウェアと通信する場合、仮想 PC の使用は最善策ではない場合があります。 詳細については、「仮想マシンのネットワーク デバッグの設定 - KDNET」を参照してください。

2. デバッガーの種類 (カーネル モードまたはユーザー モード) を決定する

次に、カーネルモードとユーザーモードのどちらのデバッグを使用するかを決める必要があります。

  • オペレーティング システムと特権プログラムはカーネル モードで実行されます。 カーネルモード コードには、システムのあらゆる部分にアクセスできるアクセス許可があり、ユーザーモード コードのように制限されません。 カーネルモード コードでは、ユーザー モードまたはカーネル モードのいずれかで実行されている他のプロセスの任意の部分にアクセスできます。 コア OS 機能の大部分と多くのハードウェア デバイス ドライバーは、カーネル モードで実行されます。

  • コンピューター上のアプリケーションとサブシステムは、ユーザー モードで実行されます。 ユーザー モードで実行されるプロセスは、独自の仮想アドレス空間内で実行されます。 システム ハードウェア、使用に割り当てられていないメモリ、システムの整合性を損なう可能性のあるシステムの他の部分など、システムの多くの部分に直接アクセスすることが制限されています。 ユーザー モードで実行されるプロセスは、システムや他のユーザー モード プロセスから効果的に分離されるため、これらのリソースに干渉することはありません。

ドライバーをデバッグすることが目的の場合は、ドライバーがカーネルモード ドライバーなのか、ユーザーモード ドライバーなのかを確認します。 Windows Driver Model (WDM) ドライバーとカーネルモード ドライバー フレームワーク (KMDF) は、どちらもカーネルモード ドライバーです。 ユーザーモード ドライバー フレームワーク (UMDF) は、読んで字のごとく、ユーザー モード ドライバーです。

問題によっては、コードがどのモードで実行されるかを判断するのが困難な場合があります。 その場合は、1 つのモードを選択して、そのモードで使用できる情報を確認する必要があるかもしれません。 一部の問題では、ユーザー モードとカーネル モードの両方でデバッガーを使用する必要があります。

デバッグするモードによっては、デバッガーをさまざまな方法で構成して使用する必要があります。 デバッグ コマンドには、両方のモードで同じように動作するものもあれば、異なる動作をするものもあります。

カーネル モードでのデバッガーの使用の詳細については、以下を参照してください。

ユーザー モードでのデバッガーの使用の詳細については、以下を参照してください。

3. デバッガー環境を選択する

WinDbg デバッガーは大半の状況で適切に機能しますが、オートメーション用のコンソール デバッガーや Visual Studio など、別のデバッガーを使用したくなる場合があります。 詳細については、「デバッグ環境」を参照してください。

4. ターゲットとホストの接続方法を決定する

通常、ターゲット システムとホスト システムはイーサネット ネットワークによって接続されています。 早期立ち上げ作業を行っている場合、またはデバイスにイーサネット接続がない場合は、他のネットワーク接続オプションを使用できます。 詳細については、次の記事を参照してください。

5. 32 ビットまたは 64 ビットのデバッグ ツールを選択する

32 ビットと 64 ビットのどちらのデバッガーが必要かは、ターゲット システムとホスト システムで実行されている Windows のバージョンと、32 ビット コードと 64 ビット コードのどちらをデバッグするかによって異なります。 詳細については、「32 ビットまたは 64 ビットのデバッグ ツールの選択」を参照してください。

6. シンボルを構成する

WinDbg で提供されている高度な機能のすべてを使用するには、適切なシンボルを読み込む必要があります。 シンボルが適切に構成されていない場合は、シンボルに依存する機能を使用しようとしたときに、そのシンボルが使用できないことを示すメッセージが表示されます。 詳細については、「Windows デバッグのシンボル」を参照してください。

7. ソース コードを構成する

独自のソース コードをデバッグすることが目的である場合は、ソース コードへのパスを構成する必要があります。 詳細については、「ソース パス」を参照してください。

8. デバッガーの操作に慣れる

このドキュメントの「デバッガーの操作」セクションでは、さまざまなタスクのデバッガー操作について説明しています。 たとえば、「デバッガー拡張機能 DLL の読み込み」では、デバッガー拡張機能を読み込む方法について説明しています。

9. デバッグ手法について理解を深める

標準的なデバッグ手法は、ほとんどのデバッグ シナリオに適用されます。例として、ブレークポイントの設定、呼び出し履歴の検査、メモリ リークの検出などがあります。 特殊なデバッグ手法は、特定のテクノロジまたはコードの種類に適用されます。 例として、プラグ アンド プレイのデバッグ、KMDF のデバッグ、RPC のデバッグなどがあります。

10. デバッガーの参照コマンドを使用する

デバッガーでの作業中に、さまざまなデバッグ コマンドを使用できます。 任意のデバッグ コマンドに関する役立つ情報を表示するには、デバッガ―で .hh コマンドを使用します。 使用できるコマンドに関する詳細については、デバッガ― リファレンスをご覧ください。

11. 特定のテクノロジに対してデバッグ拡張機能を使用する

ドメイン固有のデータ構造を解析するために使用できるデバッグ拡張機能は複数あります。 詳細については、「特殊な拡張機能」を参照してください。

このドキュメントでは、中核となる Windows 内部構造の知識があることを前提としています。 メモリ使用量、コンテキスト、スレッド、プロセスなど、Windows 内部構造の詳細については、Pavel Yosifovich、Mark E. Russinovich、David A. Solomon、Alex Ionescu による「Windows 内部構造」などのリソースを参照してください。

13. その他のデバッグに関するリソースを確認する

その他のリソースには、次の書籍やビデオがあります。

  • Inside Windows Debugging: Practical Debugging and Tracing Strategies (Tarik Soulami 著)
  • Advanced Windows Debugging(Mario Hewardt、Daniel Pravat 著)
  • デフラグ ツール ビデオ シリーズ、エピソード 13 から 29 まで、すべて WinDbg に関するエピソード

関連項目