GDB rwatch 和 awatch 命令如何工作?

Bob*_*421 4 gdb

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

(Intel x86 32 和 64 位架构)

Emp*_*ian 6

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

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

软件观察点的工作原理是单步执行应用程序,并在每条指令后检查值是否已更改。这些速度非常慢(慢了 1000 倍),并且实际上除了玩具程序之外无法用于任何其他用途。他们也无法检测访问,只能检测监视位置中值的变化。

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

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

当前指令的执行是否会触发对 eip 地址的监视读取?

它应该。你自己可以简单地回答这个问题。去尝试一下。

堆栈上的推送是否会触发堆栈内存地址上的写入?

同样地。