指定した変数またはメモリー範囲にウォッチポイントを設定します。
watch memory start-addr [, end-addr| :size] [access] [thread ID {,...}] [within funcname] [if cond] [commands] watch variable lvalue [access] [thread ID {,...}] [within funcname] [if cond] [commands]
lvalue |
メモリーの場所を指定する式。 |
ID |
スレッド ID。 |
cond |
条件式。 |
commands |
デバッガーコマンドのリスト。 |
start-addr |
メモリー領域の開始位置のアドレス。 |
end-addr |
start-addr で開始されるメモリー領域の終了位置のアドレス。 |
size |
start-addr で開始されるメモリー領域のサイズ。 |
funcname |
関数名。 |
access |
設定可能な値は以下のとおりです。 write [read (読み取り)] changed このモードはメモリー内容を変更する書き込みを検出します。 any このモードは read と write の両方を検出します。 デフォルト値: write |
このコマンドは、指定された変数またはメモリー範囲に書き込みウォッチポイントを設定します。ウォッチポイントはデータ・ブレークポイントとも呼ばれます。
varname がポインターの場合、watch variable varname ではポインターの内容はウォッチされますが、varname がポイントするメモリーはウォッチされません。watch memory *varname を使用して、varname によりポイントされるメモリーをウォッチしてください。
ウォッチポイントを使用して、変数やメモリーの場所の読み取り、書き込み、変更を特定できます。
メモリーをウォッチする変数を指定するか、メモリーを直接指定します。デバッガーがウォッチする以下の項目へのアクセスを設定できます。
[write (書き込み)] (デフォルト)
[read (読み取り)]
[write and actually change the value (書き込み、実際に値を変更)]
[all accesses (すべてのアクセス)
変数を指定した場合、ウォッチされるメモリーには、変数の型によって特定される、その変数のメモリーすべてが含まれます。
メモリーをそのアドレスで直接指定した場合、ウォッチされるメモリーは次のように定義されます。
start-addr は、メモリー領域の開始位置のアドレスです。end-addr または size を指定しない場合、メモリー領域は 8 バイト長になります。
size を指定した場合、メモリー領域は start-addr で開始し、size バイト長です。
end-addr を指定した場合、メモリー領域は start-addr から end-addr までです。
1 つまたは複数の指定スレッドに達したときにデバッガーが停止するようにウォッチポイントを設定するには、thread とスレッド ID (複数の場合はカンマで区切る) を指定します。
条件式に基づいてウォッチポイントを設定するには、if cond を指定します。
ウォッチポイントに達したときに 1 つまたは複数のコマンドを実行するには、commands を指定します。
within funcname を指定した場合、指定した関数内にアクセスが発生したときのみプログラムの実行が停止されます。
次の例は、_nextNode 変数への書き込みアクセスをウォッチします。
(idb) whatis _nextNode class Node* Node::_nextNode (idb) print "sizeof(_nextNode) =", sizeof((_nextNode)) sizeof(_nextNode) = 4 (idb) watch variable _nextNode write [#3: watch variable _nextNode write]
次の例は、コマンドラインで指定された 4 バイトをウォッチします。
(idb) watch memory &_nextNode, ((long)&_nextNode) + 3 read [#5: watch memory &_nextNode, ((long)&_nextNode) + 3 read]
次の例は、内容の変更についてコマンドラインで指定された 2 バイトをウォッチします。
(idb)
watch memory &_nextNode : 2 changed [#6: stop memory&_nextNode : 2 changed]within 修飾子を指定した場合、デバッガーは指定した関数内で発生するアクセスのみをウォッチします。ただし、呼び出した関数はウォッチしません。次に例を示します。
(idb) whatis t int t (idb) watch variable t write within C::foo(void) [#3: watch variable t write within void C::foo(void)] (idb) cont Select from ---------------------------------------------------- 1 int C::foo(double*) 2 void C::foo(float) 3 void C::foo(int) 4 void C::foo(void) 5 None of the above ---------------------------------------------------- 5 Value of <overloaded function> not completely specified foo is not a valid breakpoint address [3] Address 0x0804d5d0 was accessed at: void C::foo(void): src/x_overload.cxx [line 22, 0x08048789] foo+0x3: movl $0x0, 0x804d5d0 0x0804d5d0: Old value = 0x0000000f 0x0804d5d0: New value = 0x00000000 [3] stopped at [void C::foo(void):22 0x08048793] 22 void C::foo() { t = 0; state++; return; }