我正在调试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.已经有一个问题提出了这个问题,答案是,也许可以用勇敢的方法来做到这一点。不幸的是,答案没有包含任何例子,也没有提到瓦兰手册,所以它不是非常闪电:如何使用gdb监视整个内存区域中的任何更改?。
那么:我如何观察整个记忆区域呢?
发布于 2012-06-12 20:48:13
检测内存地址何时更改的功能称为硬件断点,它实际上是CPU的一个特性--内存控制器中的一个寄存器,用于检测何时访问特定地址,并触发调试器中断中断。不幸的是,x86体系结构 只有四个这样的寄存器 --这就是为什么您可以设置的内存监视断点数量有限的原因。
这就是为什么你需要使用类似的方法;如果你想观察整个区域,你必须使用模拟内存访问模式的软件。不过,我不知道valgrind是否真的支持观看整个记忆范围。你可能得自己修补一下。修改VALGRIND_MAKE_MEM_NOACCESS()以抛出一个断点,但可能允许程序继续。
https://stackoverflow.com/questions/11004374
复制相似问题