次の方法で共有


プロセッサのブレークポイント (ba ブレークポイント)

デバッガーの要求時にプロセッサによって制御されるブレークポイントは、 プロセッサ ブレークポイントまたは データ ブレークポイントと呼ばれます。 デバッガーによって直接制御されるブレークポイントは、 ソフトウェア ブレークポイントと呼ばれます。

手記データ ブレークポイントという用語は、プロセッサ ブレークポイントのシノニムとして一般的に使用されますが、この用語は誤解を招く可能性があります。 ブレークポイントには、プロセッサによって制御されるプロセッサ ブレークポイントと、デバッガーによって制御されるソフトウェア ブレークポイントの 2 種類があります。 プロセッサ ブレークポイントは通常、プログラム データに対して設定されます。これが"データ ブレークポイント" と呼ばれる理由ですが、実行可能コードで設定することもできます。 通常、ソフトウェア ブレークポイントは実行可能コードに設定されますが、プログラム データに設定することもできます。 残念ながら、デバッグの文献では、実行可能コードに設定されている場合でも、プロセッサ ブレークポイントを "データ ブレークポイント" と呼びます。

プロセッサ ブレークポイント

プロセッサ ブレークポイントは、特定のメモリ位置にアクセスするとトリガーされます。 プロセッサ ブレークポイントには、それをトリガーするメモリ アクセスの種類に対応する 4 種類があります。

ブレークポイントの種類 アクション
e (実行) プロセッサが指定したアドレスから命令を取得するときにトリガーされます。
r (読み取り/書き込み) プロセッサが指定したアドレスでメモリを読み書きするときにトリガーされます。
w (書き込み) プロセッサが指定したアドレスにメモリを書き込むとトリガーされます。
i (I/O) 指定したアドレスの I/O ポートにアクセスしたときにトリガーされます。

各プロセッサ ブレークポイントには、それに関連付けられたサイズがあります。 たとえば、 w (書き込み) プロセッサ ブレークポイントは、サイズが 4 バイトのアドレス 0x70001008で設定できます。 これにより、0x70001008から0x7000100Bまでのアドレスブロックが監視されます。 このメモリ ブロックが書き込まれると、ブレークポイントがトリガーされます。

プロセッサが、指定された領域と重複するが、同一ではないメモリ領域に対して操作を実行する場合があります。 前の段落で示した例では、範囲が0x70001000から0x7000100Fまで含まれる1つの書き込み操作、または0x70001009のバイトのみを含む書き込み操作は、重複する操作となります。 このような状況では、ブレークポイントがトリガーされるかどうかはプロセッサに依存します。 特定のプロセッサでこの状況がどのように処理されるかの詳細については、プロセッサ アーキテクチャのマニュアルを参照し、「デバッグ レジスタ」または「デバッグ制御レジスタ」を探してください。 1 つの特定のプロセッサの種類を例として受け取るために、x86 プロセッサでは、アクセスされた範囲がブレークポイントの範囲と重なるたびに、読み取りまたは書き込みブレークポイントがトリガーされます。

同様に、アドレス 0x00401003に e (実行) ブレークポイントが設定され、0x00401002アドレスと0x00401003にまたがる 2 バイト命令が実行される場合、結果はプロセッサに依存します。 ここでも、プロセッサ アーキテクチャのマニュアルで詳細を確認してください。

プロセッサは、ユーザー モード デバッガーによって設定されたブレークポイントと、カーネル モード デバッガーによって設定されたブレークポイントを区別します。 ユーザー モード プロセッサのブレークポイントは、カーネル モード プロセスには影響しません。 カーネル モード プロセッサのブレークポイントは、ユーザー モード コードがデバッグ レジスタの状態を使用しているかどうか、およびアタッチされているユーザー モード デバッガーがあるかどうかに応じて、ユーザー モード プロセスに影響を与える場合と影響しない場合があります。

現在のプロセスの既存のデータ ブレークポイントを別のレジスタ コンテキストに適用するには、 .apply_dbp (データ ブレークポイントをコンテキストに適用) コマンドを 使用します。

マルチプロセッサ コンピューターでは、各プロセッサ ブレークポイントはすべてのプロセッサに適用されます。 たとえば、現在のプロセッサが 3 で、コマンド ba e1 MyAddress を使用して MyAddress にブレークポイントを設定すると、そのアドレスで実行されるプロセッサ 3 だけでなく、任意のプロセッサによってブレークポイントがトリガーされます。 これは、ソフトウェア ブレークポイントにも当てはまります。

ソフトウェア ブレークポイント

プロセッサ ブレークポイントとは異なり、ソフトウェア ブレークポイントはデバッガーによって制御されます。 デバッガーは、ある場所にソフトウェア ブレークポイントを設定すると、そのメモリ位置の内容を中断命令に一時的に置き換えます。 デバッガーは、この場所の元の内容を記憶するため、このメモリがデバッガーに表示される場合、デバッガーは中断命令ではなく、そのメモリの場所の元の内容を表示します。 ターゲット プロセスがこの場所でコードを実行すると、中断命令によってプロセスがデバッガーに中断されます。 任意の選択したアクションを実行した後、ターゲットでの実行を再開させることができ、実行はその場所に本来あった命令から再開されます。

プロセッサ ブレークポイントの種類の可用性

i (i/o) オプションは、カーネル モードのデバッグ中にのみ使用できます。

すべてのデータ サイズをすべてのプロセッサ ブレークポイントの種類で使用できるわけではありません。 許可されるサイズは、ターゲット コンピューターのプロセッサによって異なります。 詳細については、 ba (アクセス時の中断) を参照してください。

ソフトウェア ブレークポイントとプロセッサ ブレークポイントの制限事項

bp または bm /a コマンドを使用する場合は、プログラム・アドレスではなくデータ・アドレスを指定できます。 ただし、データの場所が指定されている場合でも、これらのコマンドはプロセッサブレークポイントではなくソフトウェアブレークポイントを作成します。 デバッガーは、ある場所にソフトウェア ブレークポイントを配置すると、そのメモリ位置の内容を中断命令に一時的に置き換えます。 これにより、デバッガーはこの場所の元の内容を記憶し、ターゲット プロセスがこのコードを実行しようとしたときに、デバッガーが適切に応答できるため、実行可能イメージが破損することはありません。 ただし、データの場所にソフトウェア ブレークポイントを設定すると、上書きによってデータが破損する可能性があります。 したがって、データの場所にソフトウェア ブレークポイントを設定しても安全なのは、この場所が実行可能コードとしてのみ使用されることを確信している場合のみです。

bpbuおよび bm コマンドは、プロセッサ命令を中断命令に置き換えることによって、ソフトウェアブレークポイントを設定します。 したがって、これらは読み取り専用コードや上書きできないその他のコードでは使用できません。 このようなコードにブレークポイントを設定するには、e (実行) オプションを指定して ba (Break on Access) を使用する必要があります。

ブレークポイントがトリガーされたときに自動的に実行されるコマンドでのみ異なる複数のプロセッサ ブレークポイントを同じアドレスに作成することはできません。 ただし、他の制限が異なる同じアドレスに複数のブレークポイントを作成できます (たとえば、/p/t/c、/C の各オプションの値が異なる ba コマンドを使用して、同じアドレスに複数のブレークポイントを作成できます)。

ユーザー モード プロセスの初期ブレークポイント (通常は メイン 関数または同等の関数に設定されます) は、プロセッサ ブレークポイントにすることはできません。

サポートされているプロセッサ ブレークポイントの数は、ターゲット プロセッサ アーキテクチャによって異なります。

ソフトウェア ブレークポイントとプロセッサ ブレークポイントの制御

ソフトウェア ブレークポイントは、 bp (ブレークポイントの設定)bm (シンボル ブレークポイントの設定)、および bu (未解決のブレークポイントの設定) コマンドを使用して作成できます。 プロセッサ ブレークポイントは、 ba (アクセス時の中断) コマンドを 使用して作成できます。 ブレークポイントを無効にし、有効にし、変更するコマンドは、あらゆる種類のブレークポイントに適用されます。 ブレークポイントの一覧を表示するコマンドには、すべてのブレークポイントが含まれており、それぞれの種類を示します。 これらのコマンドの一覧については、「 ブレークポイントを制御する方法」を参照してください。

WinDbg ブレークポイント ダイアログ ボックスには、すべてのブレークポイントが表示され、プロセッサのブレークポイントは "e"、"r"、"w"、"i" のいずれかの記号とブロックのサイズが示されます。 このダイアログ ボックスを使用して、ブレークポイントを変更できます。 このダイアログ ボックスの [コマンド ] テキスト ボックスを使用して、任意の種類のブレークポイントを作成できます。プロセッサのブレークポイントが必要な場合は、"ba" で入力を開始します。 WinDbg 逆アセンブル ウィンドウ または ソース ウィンドウでマウスを使用してブレークポイントを設定すると、デバッガーは未解決のソフトウェア ブレークポイントを作成します。

プロセッサ ブレークポイントは、プロセッサのデバッグ レジスタに格納されます。 デバッグ レジスタ値を手動で編集してブレークポイントを設定することはできますが、これは強くお勧めしません。