【问题标题】:How do GDB rwatch and awatch commands work?GDB rwatch 和 awatch 命令如何工作?
【发布时间】:2016-10-27 11:54:49
【问题描述】:

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

(英特尔 x86 32 位和 64 位架构)

【问题讨论】:

  • 目标是什么?目标架构以及 gdb 如何在其(或远程)上运行?是 x86 + Linux 和 gdb 在同一台机器上吗?检查 gdb 的“观察点”功能:sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html - 它可以使用硬件调试寄存器(在某些目标上;硬件观察点)或慢速软件观察点工作,实现为单步执行程序并使用 ptrace 读取内存(在 linux 上,它可用于单指令步进和内存读取)。理论上可以使用 mprotect PROT_NONE 加速软件观察点并捕获 SEGV。
  • 我不知道 'rtrace' 或 'atrace' gdb 命令。你的“内存读/写断点”命令是什么?
  • 对不起,我的意思是 rwatch 和 awatch

标签: gdb


【解决方案1】:

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

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

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

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

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

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

应该的。你可以自己简单地回答这个问题。试试看吧。

压栈会触发对栈内存地址的写入吗?

同样。

【讨论】:

  • 当前指令的执行是否会触发在 eip 地址处读取的手表?推送堆栈是否会触发堆栈内存地址写入?
  • @Bob5421 答案已更新。你真的不应该问需要花费 2 分钟才能找到答案的问题。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多