在gdb中观看内存范围?

我在gdbdebugging一个程序,我希望程序在内存区域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手册的引用,所以这不是很有启发性: gdb如何用来监视整个内存区域的任何变化?

所以:我怎样才能看整个内存区域?

Solutions Collecting From Web of "在gdb中观看内存范围?"

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

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

有关更多详细信息,请参阅有关gdb集成的Valgrind用户手册

检测内存地址何时发生变化的功能被称为硬件断点 ,它实际上是CPU的功能 – 内存控制器中的一个寄存器,用于检测何时访问特定地址,并触发调试器中断。 不幸的是,x86架构 只有四个这样的寄存器 ,这就是为什么你可以设置的内存监视断点数量有限。

这就是为什么你需要使用valgrind之类的东西; 如果要观看整个地区,则必须使用模拟存储器访问模式的软件来实现。 不过,我不知道valgrind实际上是否支持观看整个内存范围。 你可能必须自己修补它。 修改VALGRIND_MAKE_MEM_NOACCESS()抛出一个断点,然后允许程序继续,也许。