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

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

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

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

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

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

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

プロセッサが、指定したリージョンと重複しているが、同一ではないメモリ領域に対して操作を実行する可能性があります。 前の段落で指定した例では、0x7000100F 0x70001000範囲を含む 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 (Break on Access) コマンドを使用して作成できます。 ブレークポイントを無効、有効、変更するコマンドは、すべての種類のブレークポイントに適用されます。 ブレークポイントの一覧を表示するコマンドには、すべてのブレークポイントが含まれており、それぞれの種類を示します。 これらのコマンドの一覧については、「 ブレークポイントを制御するメソッド」を参照してください。

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

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