C 在gdb中查看内存范围?

C 在gdb中查看内存范围?,c,linux,debugging,gdb,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)

我正在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手册,因此它不是很有启发性:


那么:我如何查看整个内存区域呢?

调用检测内存地址何时更改的功能,它实际上是CPU的一个功能—内存控制器中的一个寄存器,用于检测何时访问特定地址,并触发调试器中断。不幸的是,这就是为什么您可以设置的内存监视断点数量有限的原因


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

如果将GDB 7.4与VALGRIND 3.7.0一起使用,则 无限的“模拟”硬件观察点

在Valgrind下启动程序,给出参数
--vgdb=full--vgdb error=0
然后使用GDB连接到它(
targetremote | vgdb
)。 然后,您可以通过执行以下操作,例如
观看
唤醒
唤醒
内存范围
rwatch(字符[100])*0x5180040


有关更多详细信息,请参见

在我花了一天大部分时间摆弄
mprotect
并滥用SIGSEV处理程序中断内存访问后,我尝试了这个方法。它工作得很好。你救了我一天。非常感谢。是的,还有+1。几个月来我一直在寻找这样的特性。那么,如何确定valgrind启动的进程的堆地址呢?我通常通过/proc/[pid]/maps来完成这项工作,但是当我通过这个valgrind命令启动python时,maps文件中没有一个由[heap]标识的条目,这是我习惯于查找的。我意识到这个答案是很久以前写的,但我对这个答案感到困惑,因为gdb可以自己完成,而无需valgrind的帮助。至少现在可以。它将采用单步并反复检查。这显然非常昂贵(就像valgrind一样),因此您可以将其范围缩小到即将发生损坏时,然后创建监视点,这样您就不会让它在整个调试运行过程中缓慢运行。有趣的事实:PowerPC有范围断点(但不是监视点?):x86支持小范围监视,最多8字节: