Gdbでプログラムをデバッグしていますが、メモリ領域0x08049000〜0x0804a000にアクセスしたときにプログラムを停止したいと思います。手動でメモリブレークポイントを設定しようとすると、gdbは一度に3つ以上の場所をサポートしていないようです。
(gdb) awatch *0x08049000
Hardware access (read/write) watchpoint 1: *0x08049000
(gdb) awatch *0x08049001
Hardware access (read/write) watchpoint 2: *0x08049001
(gdb) awatch *0x08049002
Hardware access (read/write) watchpoint 3: *0x08049002
(gdb) run
Starting program: /home/iblue/git/some-code/some-executable
Warning:
Could not insert hardware watchpoint 3.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.
これは既に質問されており、その答えは、valgrindを使用してこれを実行できる可能性があるというものでした。残念ながら、回答にはvalgrindマニュアルへの例や参照が含まれていないため、あまり啓発的ではありませんでした: gdbを使用してメモリ領域全体の変更を監視するにはどうすればよいですか?
だから:どうすればメモリ領域全体を見ることができますか?
GDB7.4をValgrind3.7.0と一緒に使用する場合、無制限の「エミュレートされた」ハードウェアウォッチポイントがあります。
Valgrindでプログラムを開始し、引数_--vgdb=full --vgdb-error=0
_を指定してから、GDBを使用してプログラムに接続します(_target remote | vgdb
_)。次に、たとえばwatch
またはawatch
またはrwatch
rwatch (char[100]) *0x5180040
を実行することによるメモリ範囲
詳細は gdb統合に関するValgrindユーザーマニュアル を参照してください
メモリアドレスが変更されたことを検出する機能は ハードウェアブレークポイント と呼ばれ、実際にはCPUの機能です—特定のアドレスがアクセスされたことを検出し、トリガーするメモリコントローラー内のレジスタデバッガブレーク割り込み。残念ながら x86アーキテクチャこのようなレジスタは4つしかありません そのため、設定できるメモリウォッチブレークポイントの数に制限があります。
そのため、valgrindのようなものを使用する必要があります。領域全体を監視する場合は、メモリアクセスパターンをシミュレートするソフトウェアを使用して行う必要があります。ただし、valgrindが実際にメモリ範囲全体の監視をサポートしているかどうかはわかりません。自分でパッチを当てる必要があるかもしれません。 VALGRIND_MAKE_MEM_NOACCESS()を変更してブレークポイントをスローしますが、プログラムの続行を許可します。