回答:
watchは書き込み時にのみブレークし、rwatchは読み取り時にブレークし、awatchは読み取り/書き込み時にブレークします。
メモリ位置に読み取りウォッチポイントを設定できます。
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
しかし、1つの制限がrwatchおよびawatchコマンドに適用されます。式でgdb変数を使用することはできません。
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
そのため、自分で拡張する必要があります。
gdb$ print $ebx
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()
編集:ああ、ところで。ハードウェアまたはソフトウェアのサポートが必要です。ソフトウェアは明らかにはるかに遅いです。OSがハードウェアウォッチポイントをサポートしているかどうかを確認するには、can-use-hw-watchpoints環境設定を確認します。
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
print &variable
watch
。一方、これは上記を読んだ後に思い浮かぶ最初の質問です。rwatch *0xfeedface
実際に何バイトを監視しますか?
rwatch *(int *)0xfeedface
、それはsizeof(int)
バイトを監視します:sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints html
探しているものをウォッチポイントと呼びます。
使用法
(gdb) watch foo
:変数の値を監視する foo
(gdb) watch *(int*)0x12345678
:アドレスが指す値を監視し、必要なタイプにキャストします
(gdb) watch a*b + c/d
:プログラムの母国語で有効な、任意に複雑な式を見る
ウォッチポイントには次の3種類があります。
必要に応じて、より適切なものを選択できます。
詳細については、チェックこれを行います。
私は次のことを試しました:
$ cat gdbtest.c
int abc = 43;
int main()
{
abc = 10;
}
$ gcc -g -o gdbtest gdbtest.c
$ gdb gdbtest
...
(gdb) watch abc
Hardware watchpoint 1: abc
(gdb) r
Starting program: /home/mweerden/gdbtest
...
Old value = 43
New value = 10
main () at gdbtest.c:6
6 }
(gdb) quit
したがって、それは可能であるように見えますが、ハードウェアのサポートが必要なようです。
前述のように、watchを使用して変数がいつ書き込まれたかを確認し、rwatchを使用してそれを読み取り、awatchを使用して読み取り/書き込みを行ったときに確認します。ただし、このコマンドを使用するには、プログラムを中断する必要があり、プログラムを中断したときに変数がスコープ内にある必要があることに注意してください。
watchコマンドを使用します。watchコマンドの引数は、評価される式です。これは、ウォッチポイントを設定するバリアベルが現在のスコープ内にある必要があることを意味します。したがって、非グローバル変数にウォッチポイントを設定するには、変数がスコープ内にあるときにプログラムを停止するブレークポイントを設定しておく必要があります。プログラムが中断した後にウォッチポイントを設定します。
watch -location mTextFormatted
。