ba (アクセス時に中断)
ba コマンドは、プロセッサ ブレークポイント (正確には、データ ブレークポイントと呼ばれることが多い) を設定します。 このブレークポイントは、指定したメモリがアクセスされるとトリガーされます。
ユーザー モード
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
カーネル モード
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
パラメーター
Thread
ブレークポイントが適用されるスレッドを指定します。 構文については、「スレッドの構文」を参照してください。 スレッドは、ユーザー モードでのみ指定できます。
ID
ブレークポイントを特定する任意の番号を指定します。 ID を指定しない場合は、最初に使用可能なブレークポイント番号が使用されます。 ba と ID 番号の間にスペースを追加することはできません。 各プロセッサでサポートできるプロセッサ ブレークポイントの数は限られていますが、ID 番号の値に制限はありません。 ID を角かっこ ([ ]) で囲むと、ID に任意の式を含めることができます。 構文の詳細については、「数値式の構文」を参照してください。
Access
ブレークポイントの条件を満たすアクセスの種類を指定します。 このパラメーターには、次の値のいずれかを指定できます。
オプション | アクション |
---|---|
e (実行) |
CPU が指定したアドレスから命令を取得すると、デバッガーが中断されます。 |
r (読み取りと書き込み) |
CPU が指定したアドレスで読み取りまたは書き込みを行うと、デバッガーが中断されます。 |
w (書き込み) |
CPU が指定したアドレスで書き込みを行うと、デバッガーが中断されます。 |
i (I/O) |
(カーネル モードのみ、x86 ベースのシステムのみ) 指定した Address の I/O ポートがアクセスされると、デバッガーが中断されます。 |
Size
アクセスを監視する場所のサイズをバイト単位で指定します。 x86 ベースのプロセッサでは、このパラメーターには 1、2、または 4 を指定できます。 ただし、Access が e の場合、Size は 1 にする必要があります。
x64 ベースのプロセッサでは、このパラメーターには 1、2、4、または 8 を指定できます。 ただし、Access が e の場合、Size は 1 にする必要があります。
Options ブレークポイント オプションを指定します。 指定されている場合を除き、任意の数の次のオプションを使用できます。
/1
「ワンショット」ブレークポイントを作成します。 このブレークポイントは、トリガーされるとブレークポイントのリストから完全に削除されます。
/p EProcess
(カーネル モードのみ) このブレークポイントに関連付けられているプロセスを指定します。 EProcess は、PID ではなく EPROCESS 構造体の実際のアドレスになります。 ブレークポイントは、このプロセスのコンテキストで到達された場合のみトリガーされます。
/t EThread
(カーネル モードのみ) このブレークポイントに関連付けられているスレッドを指定します。 EThread は、スレッド ID ではなく、ETHREAD 構造体の実際のアドレスになります。 ブレークポイントは、このスレッドのコンテキストで到達された場合のみトリガーされます。 /p EProcess および /t EThread を使用する場合は、どちらの順序でも入力できます。
/c MaxCallStackDepth
ブレークポイントがアクティブになるのは、呼び出しスタックの深さが MaxCallStackDepth を下回る場合のみです。 このオプションを /C と組み合わせることはできません。
/C MinCallStackDepth
ブレークポイントがアクティブになるのは、呼び出しスタックの深さが MinCallStackDepth を上回る場合のみです。 このオプションを /c と組み合わせることはできません。
dx オブジェクト式の /w dx オブジェクト式によって返されるブール値に基づいて条件付きブレークポイントを設定します。 引数はデータ モデル (dx) 式で、true (条件に一致する - 中断) または false (条件に一致しない - 中断しない) に評価されます。
次の例は、globalVariable の値に基づいて条件付きブレークポイントを設定します。 これにより、たとえばアクセス ブレークポイントは、デバッガーが中断する必要があるかどうかを調べるときに書き込まれた値を確認できます。
ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable
この例は、JavaScript を使用してブレークポイントを設定する方法を示します。
ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable
デバッガー オブジェクトの詳細については、「dx (デバッガー オブジェクト モデル式の表示)」を参照してください。
条件付きブレークポイントの詳細については、「条件付きブレークポイントの設定」を参照してください。
Address
有効なアドレスを指定します。 アプリケーションがこのアドレスのメモリにアクセスすると、デバッガーは実行を停止し、すべてのレジスタとフラグの現在の値を表示します。 このアドレスはオフセットである必要があり、Size パラメーターと一致するように適切に調整される必要があります (例: Size が 4 の場合、Address は 4 の倍数である必要があります)。Address を省略すると、現在の命令ポインターが使用されます。 構文の詳細については、「 アドレスとアドレス範囲の構文」を参照してください。
Passes
ブレークポイントがアクティブになるまでブレークポイントが通過される回数を指定します。 この数値には、任意の 16 ビット値を指定できます。 プログラム カウンターがこのポイントを通過する回数は、この数値の値より 1 回少なくなります。 そのため、この数値を省略すると、1 に設定した場合と同じになります。 また、この数値は、アプリケーションがこのポイントを過ぎて実行された回数のみをカウントしていることにもご注意ください。 このポイントを過ぎたステップ実行またはトレースはカウントされません。 フル カウントに達した後は、ブレークポイントをクリアしてリセットすることによってのみ、この数値をリセットできます。
CommandString
ブレークポイントが指定された回数に達するたびに実行するコマンドのリストを指定します。 これらのコマンドは、t (Trace) コマンドまたは p (Step) コマンドの後ではなく、g (Go) コマンドを発行した後でブレークポイントにヒットした場合にのみ実行されます。 CommandString のデバッガー コマンドにはパラメーターを含めることができます。
このコマンド文字列は引用符で囲む必要があり、複数のコマンドをセミコロンで区切る必要があります。 標準の C 制御文字 (\n や \" など) を使用できます。 第 2 レベルの引用符 (\") に含まれるセミコロンは、埋め込まれ引用符で囲まれた文字列の一部として解釈されます。
このパラメーターは省略可能です。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ デバッグのみ |
プラットフォーム | すべて |
追加情報
プロセッサ ブレークポイントの詳細については、「プロセッサ ブレークポイント (ba ブレークポイント)」を参照してください。 ブレークポイント、ブレークポイントを制御するその他のブレークポイント コマンドとメソッド、カーネル デバッガーからユーザー空間にブレークポイントを設定する方法の詳細と例については、「ブレークポイントの使用」を参照してください。 条件付きブレークポイントの詳細については、「条件付きブレークポイントの設定」を参照してください。
備考
デバッガーは ID 番号を使用して、後の bc (ブレークポイントのクリア) コマンド、bd (ブレークポイントの無効化) コマンド、および be (ブレークポイントの有効化) コマンドでブレークポイントを参照します。
bl (ブレークポイントの一覧) コマンドを使用して、既存のすべてのブレークポイント、その ID 番号、その状態を一覧表示します。
.bpcmds (ブレークポイント コマンドの表示) コマンドを使用して、既存のすべてのブレークポイント、その ID 番号、それらを作成するために使用されたコマンドを一覧表示します。
各プロセッサ ブレークポイントには、それに関連付けられたサイズがあります。 たとえば、 w (書き込み) プロセッサ ブレークポイントは、4 バイトのサイズでアドレス 0x70001008 に設定できます。 この場合、0x70001008 から 0x7000100B までのアドレス ブロックが監視されます。 このメモリ ブロックで書き込みがあると、ブレークポイントがトリガーされます。
プロセッサが、指定された領域と重複しているものの、同一ではないメモリ領域に対して操作を実行する場合があります。 この例では、0x70001000 から 0x7000100F までの範囲を含む 1 回の書き込み操作、または 0x70001009 のバイトのみを含む書き込み操作は重複する操作になります。 このような状況では、ブレークポイントがトリガーされるかどうかはプロセッサに依存します。 具体的な詳細については、プロセッサ マニュアルを参照してください。 特定のインスタンスを 1 つ取得するために、x86 プロセッサでは、アクセスされた範囲がブレークポイントの範囲と重複するたびに、読み取りと書き込みブレークポイントがトリガーされます。
同様に、アドレス 0x00401003 に e (実行) ブレークポイントが設定され、0x00401002 アドレスと 0x00401003 アドレスにまたがる 2 バイト命令が実行された場合、その結果はプロセッサに依存します。 この場合も、プロセッサ アーキテクチャのマニュアルで詳細をご確認ください。
プロセッサは、ユーザー モード デバッガーによって設定されたブレークポイントと、カーネル モード デバッガーによって設定されたブレークポイントを区別します。 ユーザー モード プロセッサのブレークポイントは、カーネル モード プロセスには影響しません。 カーネル モード プロセッサのブレークポイントは、ユーザー モード コードがデバッグ レジスタの状態を使用しているかどうか、およびアタッチされているユーザー モード デバッガーがあるかどうかに応じて、ユーザー モード プロセスに影響する場合と影響しない場合があります。
現在のプロセスの既存のデータ ブレークポイントを別のレジスタ コンテキストに適用するには、 .apply_dbp (データ ブレークポイントをコンテキストに適用) コマンドを使用します。
マルチプロセッサ コンピューターでは、各プロセッサ ブレークポイントはすべてのプロセッサに適用されます。 たとえば、現在のプロセッサが 3 で、コマンド ba e1 MyAddress
を使用してブレークポイントを MyAddress に設定した場合、プロセッサ 3 だけではなく、そのアドレスで実行されるすべてのプロセッサがブレークポイントをトリガーします (これはソフトウェアのブレークポイントでも同様です)。
CommandString 値のみが異なる複数のプロセッサ ブレークポイントを同一アドレスに作成することはできません。 ただし、異なる制限が設定されている複数のブレークポイントを同一アドレスに作成することはできます (例: /p、/t、/c、/C の各オプションの値が異なる場合)。
プロセッサ ブレークポイントの詳細と、それらに適用されるその他の制限については、「プロセッサ ブレークポイント (ba ブレークポイント)」を参照してください。
次の例は、ba コマンドを示しています。 次のコマンドは、変数 myVar の 4 バイトに読み取りアクセスのブレークポイントを設定します。
0:000> ba r4 myVar
次のコマンドは、0x3F8 から 0x3FB までのアドレスを持つすべてのシリアル ポートにブレークポイントを追加します。 このブレークポイントは、これらのポートに何らかの読み取りまたは書き込みが行われるとトリガーされます。
kd> ba i4 3f8