33

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を使用して、メモリの領域全体の変更を監視するにはどうすればよいですか。

だから:どうすればメモリ領域全体を見ることができますか?

4

2 に答える 2

30

GDB7.4をValgrind3.7.0と一緒に使用する場合、無制限の「エミュレートされた」ハードウェアウォッチポイントがあります。

Valgrindでプログラムを開始し、引数を指定 --vgdb=full --vgdb-error=0 してから、GDBを使用してプログラムに接続します(target remote | vgdb)。次に、次のようにすることでwatch、またはawatchまたはrwatchメモリ範囲 を指定できますrwatch (char[100]) *0x5180040

詳細については、gdb統合に関するValgrindユーザーマニュアルを参照してください。

于 2012-06-13T20:00:15.600 に答える
13

メモリアドレスが変更されたことを検出する機能はハードウェアブレークポイントと呼ばれ、実際にはCPUの機能です。特定のアドレスがアクセスされたことを検出し、デバッガブレーク割り込みをトリガーするメモリコントローラ内のレジスタです。残念ながら、x86アーキテクチャ にはそのようなレジスタが4つしかないため、設定できるメモリウォッチブレークポイントの数に制限があります。

そのため、valgrindのようなものを使用する必要があります。リージョン全体を監視する場合は、メモリアクセスパターンをシミュレートするソフトウェアを使用して監視する必要があります。ただし、valgrindが実際にメモリ範囲全体の監視をサポートしているかどうかはわかりません。自分でパッチを適用する必要があるかもしれません。VALGRIND_MAKE_MEM_NOACCESS()を変更してブレークポイントをスローしますが、プログラムを続行できるようにします。

于 2012-06-12T20:48:13.210 に答える