2011-11-08 25 views
2

LinuxでValgrindやその他のデバッガを使用すると、変数が変更された場所をどのように見えるのでしょうか。私はgccを使用しています。 GDBを使用してコードにステップインしたいとは思わないことに注意してください。私はちょうどプログラムを実行して、デバッガに、最終的に変数がコード内で変更された場所を報告してもらいたい。変数が変更されたときの確認

+3

[GDBで 'メモリアクセス'にブレークポイントを設定することはできますか?](http://stackoverflow.com/questions/58851/can-i-set-a-breakpoint-on-memory-access- in-gdb) – bobbymcr

答えて

1

gdbでこれを行うにはBreakpoint Command Listsを使用してください。見る変数のアドレスを知る必要があります。このような一連のコマンドとウォッチポイントを設定します。

watch *0xfeedface 
commands 
silent 
bt 
cont 
end 

ます。また、必要に応じてファイルをログに記録するすべてのこの出力を保存することができます。詳細はgdb docをご覧ください。

2

おっと、それは考えていません正確な重複Can I set a breakpoint on 'memory access' in GDB?の方が少しお尋ねしますので、だから、:

  1. 使用GDB
  2. は、あなたが(ハードウェアウォッチポイントのみアドレスを見ることのために働く見たいので、あなたは、変数やオブジェクトがインスタンス化されているポイントにそれを実行する必要がアドレスを検索し、自分を取りますアドレスとそのアドレスにwatchコマンドを使用し
  3. あなたのバックトレース(またはあなたが収集する必要がある他の情報)を得て続行するアドレスにコマンドを取り付け

だからあなたのようなものがあるでしょう。。:

p &variable 
watch *$$ 
cmd 
bt 
c 
end 

(私はpコマンドで印刷されたとして、私は通常$nを使用し、$$と完全に確認していません)。

+0

変数が多くの場所(例えばタイトなループ)で変更されている場合、これは*たぶん遅くなります。あなたの最後の手段なら、この方法だけを使うといいでしょう。 –

+0

上記のウォッチポイントは通常ハードウェアウォッチポイントであるため、変数の変更に従うことを望むと仮定すると、それほど遅くはありません。 –

+0

@BasileStarynkevitch: 'cmd/bt/c/end'を追加すると、遅くなります。それはウォッチポイントではなく、それを遅くするバックトレースの印刷です。 –

関連する問題