2009-08-30 7 views
32
  1. は、それが自動的に削除されます。それを一度設定し、同じ範囲に入るたびに自動的に生き続ける方法はありますか?どのようにローカルスコープの変数に対して永続および条件付きウォッチポイントを設定しますか?私は現在のスコープに変数のローカル用ウォッチポイントを設定した場合、スコープの外に行くとき

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

答えて

3
  1. 私は、正確な答えは異なりますので、私たちは、使用している言語わからないんだけど、あなたは、静的なグローバル、または動的に割り当てられるようにどちらかの変数を変更(および自由ませんでした関数が返ったときは?)。このようにして、生のアドレスは変更されず、gdbはブレークポイントでそれを実行できます。代わりに、それが特定の値に等しいWHE値を見ての

  2. var1の値をチェックする行に条件付きブレークポイントを設定する必要があります。これは事実上同じ効果を有するべきである。

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

私はC++を使用しています。私は変数の値を変更するコードの多くの場所がある可能性があるので、ブレークポイントを越えてウォッチポイントを使用します。したがって、各場所にブレークポイントを追加するのは現実的ではありません。条件付きウォッチポイントを設定できるかどうかを確認したいと思います。 – Tim

29

私は条件付きブレークポイントが行く方法であることに同意します。

しかし、尋ねたことをするには、GDBのcommandsコマンドを使用して、ブレークポイントに達するたびに実行するGDBコマンドのリストを設定することができます。私はこれが信じられないほど便利だと思います。

私は、彼らが編集しやすいとsourceコマンドを使用して再ロードすることは容易になるように、あなたのGDBを書くことは、ファイルにコマンドを示唆しています。あるいは、GDBコマンドラインでロードするコマンドファイルを指定したり、.gdbinitを使ってそれらを自動的にロードさせることができます。

commandsの良い使用例:
は、私は他の機能の多くによって呼び出される関数formatがあるとします。私はそれを打破したいが、関数do_step_3が呼び出された後でなければならない。あなたがブレークポイントで行うのと同じ方法でウォッチポイントに条件を設定することができます

break func 
commands 
    watch var 
    continue 
end 
+0

優れた点!ありがとう! – Tim

12

break do_step_3 
commands 
    break format 
    continue 
end 

次のようなもので、あなたの問題のためにこれを使用することができます。これはin the documentationですが、それ自体はほとんど注目されていません。

conditionコマンドがないようwatch my_var if my_var > 3は、うまく動作します。

それは見ている変数がスコープ外になった場合、ウォッチポイントを再作成するには、斬は説明したように、GDBは関数の先頭にブレークポイントを使用してこれを自動的に行う必要があります。

8

範囲外のウォッチポイントは、メモリアドレスに設定することで設定できます。

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

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

+6

これは便利ですが、ここでは機能しません。ローカル変数は関数呼び出し間で同じアドレスを保持しませんが、他のスタック変数はそのメモリ位置を使用する可能性があります... – Nick

関連する問題