我发现在GDB中可以设置一个断点,当读取或写入特定的内存地址时将触发该断点。 我想知道它是如何工作的。 GDB是否有一种进程内存的副本并检查每条指令之间的变化?或者它是一个系统调用或内核功能?
(Intel x86 32和64位架构)
答案 0 :(得分:1)
我想知道它是如何运作的。
有两种方法:软件观察点和硬件观察点(仅在某些架构上可用)。
软件观察点通过单步执行应用程序,并在每条指令后检查值是否已更改来工作。这些都非常缓慢(慢1000倍),并且在实践中除了玩具程序之外不能用于任何其他任何东西。他们也无法检测访问权限,只能更改观看位置的值。
硬件观察点需要处理器支持。英特尔x86芯片具有debug registers,可对其进行编程以监视给定内存位置的访问(awatch
,rwatch
)或更改(watch
)。当处理器检测到感兴趣的位置已被访问时,它会引发调试异常,操作系统将其转换为信号,并且(像往常一样)在目标看到之前向调试器发出信号。
HW观察点以原生速度执行,但(在x86上)您最多只能有4个不同的地址(实际上,我从不需要超过2个)。
当前指令的执行是否触发了在eip地址读取的手表?
它应该。你可以自己轻易回答这个问题。试试吧。
推送堆栈会触发堆栈内存地址写入吗?
同样。