2016-05-04 5 views
4

gdbセッションを開始し、ブレークポイントを作成して実行するとします。同じgdbセッションで再実行中のハードウェアウォッチポイントを保持することはできますか?

私が壊れた後、私は現在の実行中のシンボルのメモリアドレスに基づいてウォッチポイントを作成し、元のブレークポイントを削除します。

しばらくして、私はControl-Cでプログラムを中断しますが、まだgdbの中に入れて、runコマンドを発行してプログラムを最初からやり直します。

しかし、私はデバッグされたプロセスの再起動時にハードウェアウォッチポイントを保持したいと思います。

再実行時にハードウェアウォッチポイントを保持できるgdb設定がありますか?


更新:これは問題を再現するための例です。

int main(){ 
    int NeverGoOutOfScope = 0; 
    NeverGoOutOfScope = 7; 
    while (1); 
} 

ここにはgdbコマンドのシーケンスがあります。

break 3 
run 
watch NeverGoOutOfScope 
info watch 
run 
# After this point, the breakpoint remains but the watchpoint is gone. 
info watch 

ウォッチポイントを再作成せずに保存することはできますか?

+0

はデフォルトでは保存されていませんか? –

+0

ウォッチポイントが消えます。ブレークポイントは保存されます。 – merlin2011

+0

ブレークポイントの再設定中にエラーが発生しました。NUMBER:現在のコンテキスト内にvariable_nameというシンボルはありませんが、ウォッチポイントはブレークポイントリストに残ります: 'NUMBER hw watchpoint keep y variable_name'とその値が出力されています次の実行で... –

答えて

2

これは2つの条件で動作するはずです。まず、アドレス空間のランダム化を無効にする。第二に、watch -locationを使用しています。

ランダム化を無効にするには、使用:

(gdb) set disable-randomization on 

私はあなたがこれをスキップすることができるかもしれないので、これは、デフォルトだと思います。

次に、使用:

(gdb) watch -location NeverGoOutOfScope 

これは、ウォッチポイントでの変数のアドレスを記録します。これはほとんど常にあなたが望むものです - 変数が範囲外になったときにウォッチポイント式を再評価するための素晴らしいコードがgdbにありますが、実際にはこれは参考になるよりも混乱していると思います。

このアプローチはテストでは役に立ちますが、プロセス初期化中にウォッチポイントのヒット数を無視する必要があります。

関連する問題