web-dev-qa-db-ja.com

ローカルスコープの変数に永続的で条件付きのウォッチポイントを設定するにはどうすればよいですか?

  1. 現在のスコープにローカルな変数のウォッチポイントを設定した場合、スコープから出ると自動的に削除されます。同じスコープに入るたびに一度設定して自動存続させる方法はありますか?

  2. とにかくwatch var1 if var1==0のような条件付きウォッチポイントを設定することはありますか?私の場合、条件は機能しません。 gdbは、var1がtrueになるまでではなく、var1 == 0の値が変更されるたびに停止します。私のgdbはGNU gdb 6.8-debianです。

38
Tim

条件付きブレークポイントが進むべき道であることにデーブに同意します。

ただし、要求したことを行うには、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
33
Zan Lynx

ウォッチポイントの条件は、ブレークポイントの場合と同じ方法で設定できます。これは ドキュメンテーション ですが、確かにそれ自体に注意を向けることはほとんどありません。

そう watch my_var if my_var > 3は、conditionコマンドと同様に正常に機能します。

監視している変数がスコープ外になった場合にウォッチポイントを再作成するには、Zanが説明したように、関数の開始時にブレークポイントを使用してgdbにこれを自動的に実行させます。

14
Robie Basak

メモリアドレスに設定することで、スコープ外にならないウォッチポイントを設定できます。

(gdb) p &var1
$1 = (int *) 0x41523c0
(gdb) watch *(int *)0x41523c0
Hardware watchpoint 1: *(int *)0x41523c0

これは、他のデータ型およびポインターでも機能します。

8
Daniel Spång
  1. 使用している言語がわからないので、正確な答えは異なりますが、変数を静的、グローバル、または動的に割り当てられるように変更できます(関数が戻ったときに解放しないでください)。この方法では、生のアドレスは変更されず、gdbはそのアドレスにブレークポイントを設定できます。

  2. 特定の値と等しい値を監視する代わりに、 var1の値を確認する行に条件付きブレークポイントを設定する必要があります。これは実質的に同じ効果を持つはずです

例えば.

(gdb) break main.c:123 if (var1 == 0)
4
DaveR