Windows のデバッグの概要

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

Windows のデバッグを開始するには、この記事で説明されているタスクを完了します。

1. ホストとターゲットを決定する

デバッガーは "ホスト" システムで実行され、デバッグするコードは "ターゲット" システムで実行されます。

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

host and target pcs connected with a double arrow.

プロセッサでの命令の実行は、デバッグ時には停止されるのが一般的であるため、通常は 2 台のコンピューター システムが使用されます。 場合によっては、仮想マシンを 2 台目のシステムとして使用できることもあります。 たとえば、デバッグする必要のあるコードと同じ PC で実行されている仮想 PC を使用できる場合があります。 ただし、コードが低レベルのハードウェアと通信している場合は、仮想 PC を使用するのは最善の方法ではない可能性があります。 詳細については、「仮想マシンのネットワーク デバッグの設定 - KDNET」を参照してください。

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

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

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

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

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

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

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

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

ユーザー モードでのデバッガーの使用の詳細については、「WinDbg の概要 (ユーザー モード)」を参照してください。

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

WinDbg は、ほとんどの状況で適切に機能しますが、別のデバッガー (自動化や Visual Studio のコンソール デバッガーなど) を使用することが必要になる場合があります。 詳細については、「デバッグ環境」を参照してください。

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

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

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

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

6. シンボルを構成する

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

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

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

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

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

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

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

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

そのうちに、デバッガーでの作業にさまざまなデバッグ コマンドを使用するようになります。 デバッグ コマンドに関するヘルプ情報を表示するには、デバッガーで .hh (HTML ヘルプ ファイルを開く) コマンドを使用します。 使用可能なコマンドの詳細については、「デバッガー リファレンス」を参照してください。

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

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

このドキュメントでは、Windows の内部構造に関する知識があることを前提としています。 Windows の内部構造 (メモリ使用量、コンテキスト、スレッド、プロセスなど) の詳細については、『Windows Internals』(Mark Russinovich、David Solomon、Alex Ionescu 著) などのその他のリソースをご確認ください。

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

その他のリソースには、次の書籍とビデオが含まれます。

  • Inside Windows Debugging: Practical Debugging and Tracing Strategies (Tarik Soulami 著)
  • Advanced Windows Debugging(Mario Hewardt、Daniel Pravat 著)
  • デフラグ ツール、エピソード 13 から 29、WinDbg についてすべて。

関連項目