在gdb中观察内存范围?

时间:2012-06-12 20:30:43

标签: c linux debugging gdb

我正在调试gdb中的程序,我希望程序在访问内存区域0x08049000到0x0804a000时停止。当我尝试手动设置内存断点时,gdb似乎一次不支持两个以上的位置。

(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手册的引用,因此它不是很有启发性:How can gdb be used to watch for any changes in an entire region of memory?

那么:我怎样才能观察整个记忆区域?

2 个答案:

答案 0 :(得分:25)

如果您将GDB 7.4与Valgrind 3.7.0一起使用,那么您就拥有了 无限制的“模拟”硬件观察点。

在Valgrind下启动程序,给出参数    --vgdb=full --vgdb-error=0 然后使用GDB连接到它(target remote | vgdb)。 然后你可以,例如通过执行watchawatchrwatch内存范围   rwatch (char[100]) *0x5180040

有关详细信息,请参阅the Valgrind user manual on gdb integration

答案 1 :(得分:12)

检测内存地址何时更改的功能称为a hardware breakpoint,它实际上是CPU的一项功能 - 内存控制器内部的一个寄存器,用于检测何时访问特定地址,以及触发调试器中断。遗憾的是the x86 architecture only has four such registers以及您可以设置的内存监视断点数限制的原因。

这就是为什么你需要使用像valgrind这样的东西;如果要观看整个区域,则必须使用模拟内存访问模式的软件来完成。但我不知道valgrind是否真的支持观看整个内存范围。您可能需要自己修补它。修改VALGRIND_MAKE_MEM_NOACCESS()以抛出断点,但然后允许程序继续,可能。