プロセッサのブレークポイント (ba ブレークポイント)
デバッガの要求に応じてプロセッサによって制御されるブレークポイントは プロセッサ ブレークポイント または データ ブレークポイントと呼ばれます。 デバッガーによって直接制御されるブレークポイントは、 ソフトウェア ブレークポイントと呼ばれます。
注:データ ブレークポイント という用語は、 プロセッサ ブレークポイントのシノニムとして一般的に使用されますが、この用語は誤解を招く可能性があります。 ブレークポイントには、プロセッサによって制御されるプロセッサ ブレークポイントと、デバッガーによって制御されるソフトウェア ブレークポイントの 2 種類があります。 プロセッサ ブレークポイントは通常、プログラム データに対して設定されます。これが"データ ブレークポイント" と呼ばれる理由ですが、実行可能コードで設定することもできます。 通常、ソフトウェア ブレークポイントは実行可能コードに設定されますが、プログラム データに設定することもできます。 残念ながら、デバッグの文献では、実行可能コードに設定されている場合でも、プロセッサ ブレークポイントを "データ ブレークポイント" と呼びます。
プロセッサ ブレークポイント
プロセッサ ブレークポイントは、特定のメモリ位置にアクセスするとトリガーされます。 プロセッサ ブレークポイントには、それをトリガーするメモリ アクセスの種類に対応する 4 種類があります。
ブレークポイント の種類 | アクション |
---|---|
e (実行) | プロセッサが指定したアドレスから命令を取得するときにトリガーされます。 |
r (読み取りと書き込み) | プロセッサが指定したアドレスでメモリを読み書きするときにトリガーされます。 |
w (書き込み) | プロセッサが指定されたアドレスにメモリに書き込むときにトリガーされます。 |
i (I/O) | 指定したアドレスの I/O ポートにアクセスしたときにトリガーされます。 |
各プロセッサ ブレークポイントには、それに関連付けられたサイズがあります。 たとえば、 w (書き込み) プロセッサ ブレークポイントは、4 バイトのサイズでアドレス 0x70001008 に設定できます。 この場合、0x70001008 から 0x7000100B までのアドレス ブロックが監視されます。 このメモリ ブロックで書き込みがあると、ブレークポイントがトリガーされます。
プロセッサが、指定された領域と重複しているものの、同一ではないメモリ領域に対して操作を実行する場合があります。 前の段落で示した例では、0x70001000 ~ 0x7000100F の範囲を含む単一の書き込み操作、または 0x70001009 のバイトのみを含む書き込み操作は、重複操作になります。 このような状況では、ブレークポイントがトリガーされるかどうかはプロセッサに依存します。 特定のプロセッサでこの状況がどのように処理されるかの詳細については、プロセッサアーキテクチャのマニュアルを参照し、「デバッグ レジスタ」または「デバッグ コントロール レジスタ」を探します。 特定のプロセッサ タイプを例に挙げると、x86 プロセッサでは、アクセスされた範囲がブレークポイント範囲と重なるたびに、読み取りまたは書き込みブレークポイントがトリガーされます。
同様に、アドレス 0x00401003 に e (実行) ブレークポイントが設定され、0x00401002 アドレスと 0x00401003 アドレスにまたがる 2 バイト命令が実行された場合、その結果はプロセッサに依存します。 この場合も、プロセッサ アーキテクチャのマニュアルで詳細をご確認ください。
プロセッサは、ユーザー モード デバッガーによって設定されたブレークポイントと、カーネル モード デバッガーによって設定されたブレークポイントを区別します。 ユーザー モード プロセッサのブレークポイントは、カーネル モード プロセスには影響しません。 カーネル モード プロセッサのブレークポイントは、ユーザー モード コードがデバッグ レジスタの状態を使用しているかどうか、およびアタッチされているユーザー モード デバッガーがあるかどうかに応じて、ユーザー モード プロセスに影響する場合と影響しない場合があります。
現在のプロセスの既存のデータ ブレークポイントを別のレジスタ コンテキストに適用するには、 .apply_dbp (データ ブレークポイントをコンテキストに適用) コマンドを使用します。
マルチプロセッサ コンピューターでは、各プロセッサ ブレークポイントはすべてのプロセッサに適用されます。 たとえば、現在のプロセッサが 3 で、コマンド ba e1 MyAddress
を使用してブレークポイントを MyAddress に設定した場合、プロセッサ 3 だけではなく、そのアドレスで実行されるすべてのプロセッサがブレークポイントをトリガーします (これはソフトウェアのブレークポイントでも同様です).
ソフトウェア ブレークポイント
プロセッサ ブレークポイントとは異なり、ソフトウェア ブレークポイントはデバッガーによって制御されます。 デバッガーは、ある場所にソフトウェア ブレークポイントを設定すると、そのメモリ位置の内容を中断命令に一時的に置き換えます。 デバッガーは、この場所の元の内容を記憶するため、このメモリがデバッガーに表示される場合、デバッガーは中断命令ではなく、そのメモリの場所の元の内容を表示します。 ターゲット プロセスがこの場所でコードを実行すると、中断命令によってプロセスがデバッガーに中断されます。 選択したアクションを実行すると、ターゲットで実行が再開され、その場所にもともと存在していた命令で実行が再開されます。
プロセッサ ブレークポイントの種類の可用性
i (i/o) オプションは、カーネル モードのデバッグ中にのみ使用できます。
すべてのデータ サイズをすべてのプロセッサ ブレークポイントの種類で使用できるわけではありません。 許可されるサイズは、ターゲット コンピューターのプロセッサによって異なります。 詳細については、 ba (アクセス時の中断) を参照してください。
ソフトウェア ブレークポイントとプロセッサ ブレークポイントの制限事項
bp または bm /a コマンドを使用するときは、プログラム アドレスではなくデータ アドレスを指定できます。 ただし、データの位置が指定されていても、これらのコマンドはプロセッサ ブレークポイントではなく、ソフトウェア ブレークポイントを作成します。 デバッガがソフトウェア ブレークポイントをある場所に配置すると、そのメモリ場所の内容が一時的にブレーク命令に置き換えられます。 これにより、デバッガーはこの場所の元の内容を記憶し、ターゲット プロセスがこのコードを実行しようとしたときに、デバッガーが適切に応答できるため、実行可能イメージが破損することはありません。 ただし、データの場所にソフトウェア ブレークポイントを設定すると、上書きによってデータが破損する可能性があります。 したがって、データの場所にソフトウェア ブレークポイントを設定しても安全なのは、この場所が実行可能コードとしてのみ使用されることを確信している場合のみです。
bp、 bu、および bm コマンドは、プロセッサ命令をブレーク命令に置き換えることで、ソフトウェア ブレークポイントを設定します。 したがって、これらは読み取り専用コードや上書きできないその他のコードでは使用できません。 このようなコードにブレークポイントを設定するには、 e (実行) オプションを指定して ba (アクセス時に中断) を使用する必要があります。
ブレークポイントがトリガーされたときに自動的に実行されるコマンドのみが異なる複数のプロセッサ ブレークポイントを同じアドレスに作成することはできません。 ただし、他の制限が異なる同じアドレスに複数のブレークポイントを作成できます (たとえば、 /p、 /t、 /c、 /C の各オプションの値が異なる ba コマンドを使用して、同じアドレスに複数のブレークポイントを作成できます)。
ユーザー モード プロセスの初期ブレークポイント (通常は、 メイン 関数またはそれに相当する関数に設定されます) は、プロセッサ ブレークポイントにすることはできません。
サポートされているプロセッサ ブレークポイントの数は、ターゲット プロセッサ アーキテクチャによって異なります。
ソフトウェア ブレークポイントとプロセッサ ブレークポイントの制御
ソフトウェア ブレークポイントは、 bp (ブレークポイントの設定)、 bm (シンボル ブレークポイントの設定)、および bu (未解決のブレークポイントの設定) コマンドを使用して作成できます。 プロセッサ ブレークポイントは、 ba (アクセス時の 中断) コマンドを使用して作成できます。 ブレークポイントの無効化、有効化、および変更を実行するコマンドは、あらゆる種類のブレークポイントに適用されます。 ブレークポイントのリストを表示するコマンドには、すべてのブレークポイントが含まれており、それぞれの種類も示されます。 これらコマンドのリストについては、「 ブレークポイントを制御する方法」を参照してください。
[WinDbg ブレークポイント ] ダイアログ ボックスには、すべてのブレークポイントが表示され、プロセッサのブレークポイントが "e"、"r"、"w"、または "i" の後にブロックのサイズが続きます。 このダイアログ ボックスを使用して、ブレークポイントを変更できます。 このダイアログ ボックスの [ コマンド ] テキスト ボックスを使用して、任意の種類のブレークポイントを作成できます。プロセッサのブレークポイントが必要な場合は、"ba" で入力を開始します。 WinDbg の [逆アセンブル] ウィンドウまたは または ソース ウィンドウでマウスを使用してブレークポイントを設定すると、デバッガーは未解決のソフトウェア ブレークポイントを作成します。
プロセッサ ブレークポイントは、プロセッサのデバッグ レジスタに格納されます。 デバッグ レジスタ値を手動で編集してブレークポイントを設定することはできますが、これは強くお勧めしません。