Watch a memory range in gdb?
我正在调试gdb中的程序,并且当访问内存区域0x08049000至0x0804a000时,我希望该程序停止。 当我尝试手动设置内存断点时,gdb似乎一次不支持两个以上的位置。
1 2 3 4 5 6 7 8 9 10 11 12 | (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监视整个内存区域中的任何更改?
因此:如何查看整个内存区域?
如果将GDB 7.4与Valgrind 3.7.0一起使用,则您拥有
无限的"模拟"硬件观察点。
在Valgrind下启动程序,并提供参数
然后使用GDB连接到它(
然后您可以例如通过执行
有关更多详细信息,请参见Valgrind关于gdb集成的用??户手册。
检测内存地址何时更改的功能称为硬件断点,它实际上是CPU的功能,内存控制器内部的寄存器用于检测何时访问特定地址并触发调试器中断中断。不幸的是,x86体系结构只有四个这样的寄存器,这就是为什么您可以设置的内存监视断点数量受到限制的原因。
这就是为什么您需要使用valgrind之类的原因。如果要观看整个区域,则必须使用模拟内存访问模式的软件来进行。我不知道valgrind是否实际上支持监视整个内存范围。您可能需要自己打补丁。修改VALGRIND_MAKE_MEM_NOACCESS()抛出一个断点,但是然后允许程序继续运行。