GDB rwatch和awatch命令如何工作?

时间:2016-06-24 19:13:06

标签: gdb

我发现在GDB中可以设置一个断点,当读取或写入特定的内存地址时将触发该断点。 我想知道它是如何工作的。 GDB是否有一种进程内存的副本并检查每条指令之间的变化?或者它是一个系统调用或内核功能?

(Intel x86 32和64位架构)

1 个答案:

答案 0 :(得分:1)

  

我想知道它是如何运作的。

有两种方法:软件观察点和硬件观察点(仅在某些架构上可用)。

软件观察点通过单步执行应用程序,并在每条指令后检查值是否已更改来工作。这些都非常缓慢(慢1000倍),并且在实践中除了玩具程序之外不能用于任何其他任何东西。他们也无法检测访问权限,只能更改观看位置的值。

硬件观察点需要处理器支持。英特尔x86芯片具有debug registers,可对其进行编程以监视给定内存位置的访问(awatchrwatch)或更改(watch)。当处理器检测到感兴趣的位置已被访问时,它会引发调试异常,操作系统将其转换为信号,并且(像往常一样)在目标看到之前向调试器发出信号。

HW观察点以原生速度执行,但(在x86上)您最多只能有4个不同的地址(实际上,我从不需要超过2个)。

  

当前指令的执行是否触发了在eip地址读取的手表?

它应该。你可以自己轻易回答这个问题。试试吧。

  

推送堆栈会触发堆栈内存地址写入吗?

同样。