現在のスコープにローカルな変数のウォッチポイントを設定した場合、スコープから出ると自動的に削除されます。同じスコープに入るたびに一度設定して自動存続させる方法はありますか?
とにかくwatch var1 if var1==0
のような条件付きウォッチポイントを設定することはありますか?私の場合、条件は機能しません。 gdbは、var1
がtrueになるまでではなく、var1 == 0
の値が変更されるたびに停止します。私のgdbはGNU gdb 6.8-debianです。
条件付きブレークポイントが進むべき道であることにデーブに同意します。
ただし、要求したことを行うには、GDBのcommands
コマンドを使用して、ブレークポイントにヒットしたときに実行するGDBコマンドのリストを設定できます。これは非常に便利です。
編集が簡単で、source
コマンドを使用して簡単に再読み込みできるように、GDBコマンドをファイルに書き込むことをお勧めします。または、GDBコマンドラインでロードするコマンドファイルを指定するか、.gdbinitを使用してそれらを自動的にロードすることができます。
commands
の適切な使用例:
他の多くの関数から呼び出される関数format
があるとします。中断したいのですが、関数do_step_3
が呼び出された後でのみです。
break do_step_3
commands
break format
continue
end
あなたはあなたの問題にこれを使うことができます:
break func
commands
watch var
continue
end
ウォッチポイントの条件は、ブレークポイントの場合と同じ方法で設定できます。これは ドキュメンテーション ですが、確かにそれ自体に注意を向けることはほとんどありません。
そう watch my_var if my_var > 3
は、condition
コマンドと同様に正常に機能します。
監視している変数がスコープ外になった場合にウォッチポイントを再作成するには、Zanが説明したように、関数の開始時にブレークポイントを使用してgdbにこれを自動的に実行させます。
メモリアドレスに設定することで、スコープ外にならないウォッチポイントを設定できます。
(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0
これは、他のデータ型およびポインターでも機能します。
使用している言語がわからないので、正確な答えは異なりますが、変数を静的、グローバル、または動的に割り当てられるように変更できます(関数が戻ったときに解放しないでください)。この方法では、生のアドレスは変更されず、gdbはそのアドレスにブレークポイントを設定できます。
特定の値と等しい値を監視する代わりに、 var1
の値を確認する行に条件付きブレークポイントを設定する必要があります。これは実質的に同じ効果を持つはずです
例えば.
(gdb) break main.c:123 if (var1 == 0)