Windows デバッグを始める

この記事では、WinDbg やその他のデバッグ ツールを使用してWindowsデバッグを開始する方法について説明します。 あなたは次のことを学びます:

  • デバッガーをインストールし、ホスト システムとターゲット システムを設定する
  • デバッグ環境を構成する
  • カーネル モードとユーザー モードのシナリオに関する基本的なデバッグ手法をマスターする

代わりにクラッシュ ダンプを分析する場合は、「 ダンプ ファイルから情報を抽出する」を参照してください。

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

1. Windows デバッガーをインストールする

WinDbg をインストールして、アプリケーションとドライバー Windowsデバッグを開始します。 詳細なインストール手順については、「 WinDbg のインストール」を参照してください。

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

通常、デバッグには 2 つの独立したコンピューター システムを使用します。これは、通常、プロセッサでの命令の実行が一時停止されるためです。 デバッガーは ホスト システムで実行され、デバッグするコードは ターゲット システムで実行されます。

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

ホストとターゲット デバッグ システムを接続する二重矢印を示す図のスクリーンショット。

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

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

次に、カーネル モードデバッグとユーザーモードデバッグのどちらを使用するかを決定します。

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

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

目的がドライバーをデバッグする場合は、ドライバーがカーネル モード ドライバーかユーザー モード ドライバーかを判断します。 Windows ドライバー モデル (WDM) ドライバーと Kernel-Mode Driver Framework (KMDF) はどちらもカーネル モード ドライバーです。 名前が示すように、User-Mode Driver Framework (UMDF) ドライバーはユーザー モード ドライバーです。

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

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

カーネル モード デバッグの次の手順

ユーザー モード デバッグの次の手順

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

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

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

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

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

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

7. シンボルを構成する

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

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

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

9. デバッガーの操作について理解する

このドキュメントの「デバッガー操作」セクションでは、さまざまなタスクのデバッガー操作について説明します。 たとえば、WinDbg でのログ ファイルの保持 では、デバッグ セッションを記録するログ ファイルを WinDbg で書き込む方法について説明します。

10. デバッグ手法を理解する

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

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

デバッガーで作業するときは、さまざまなデバッグ コマンドを使用します。 デバッグ中にコマンドに関するヘルプを表示するには、 .hh コマンドの後にコマンド名を付けます。

例:

.hh bp # Get help on breakpoint commands
.hh k # Get help on call stack commands

使用可能なコマンドの完全な一覧については、「 デバッガーリファレンス」を参照してください。

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

複数のデバッグ拡張機能を使用して、ドメイン固有のデータ構造を解析します。 詳細については、「特殊化された拡張機能」を参照してください。 デバッガー拡張機能を読み込む方法については、「デバッガー 拡張機能 DLL の読み込み」を参照してください。

このドキュメントでは、コア Windows内部に関する知識があることを前提としています。 メモリ使用量、コンテキスト、スレッド、プロセスなど、Windows内部の詳細については、Pavel Yosifovich、Mark E. Russinovich、David A. Solomon、Alex Ionescu による Windows Internals などのリソースを確認します。

14. 追加のデバッグ リソースを確認する

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

  • Inside Windows デバッグ: 実践的なデバッグとトレース戦略 by Tarik Soulami
  • Advanced Windows Debugging by Mario Hewardt and Daniel Pravat
  • デフラグツール ビデオシリーズ、エピソード13から29、WinDbgについて

次のステップ

デバッグ モードを選択して続行します。

カーネル モード デバッグ (ドライバーと OS コンポーネントの場合):

ユーザー モード デバッグ (アプリケーションの場合):

追加のセットアップ ガイダンス: