gdb を介してアプリケーションを実行していますが、特定の変数がアクセスまたは変更されるたびにブレークポイントを設定したいと考えています。これを行うための良い方法はありますか?C/C++ で変数を監視して、変数がいつ変更されるかを確認する他の方法にも興味があります。
6 に答える
watchは書き込み時にのみ中断し、rwatchは読み取り時に中断し、awatchは読み取り/書き込み時に中断します。
メモリの場所に読み取りウォッチポイントを設定できます。
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
ただし、rwatchコマンドとawatchコマンドには1つの制限が適用されます。式で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.
探しているものはウォッチポイントと呼ばれます。
使用法
(gdb) watch foo
:変数の値を見る foo
(gdb) watch *(int*)0x12345678
:任意の型にキャストされたアドレスが指す値を監視します
(gdb) watch a*b + c/d
:プログラムの母国語で有効な任意の複雑な式を見る
ウォッチポイントには次の 3 種類があります。
- watch :書き込みが発生すると gdb が壊れます
- rwatch :読み取りが発生すると gdb が壊れます
- awatch :どちらの場合もgdb は壊れます
ニーズに合わせてより適切なものを選択できます。
詳細については、こちらをご覧ください。
最初の答えが C に似た構文を参照していると仮定すると、(char *)(0x135700 +0xec1a04f)
行うべき答えrwatch *0x135700+0xec1a04f
は正しくありません。正しい構文はrwatch *(0x135700+0xec1a04f)
.
そこに s がないため、()
自分でウォッチポイントを使用しようとするのに非常に苦労しました。
私はちょうど次のことを試しました:
$ 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
可能だと思われますが、ハードウェア サポートが必要なようです。