【问题标题】:How to set GDB read watchpoint in registers?如何在寄存器中设置 GDB 读取观察点?
【发布时间】:2018-11-21 16:29:35
【问题描述】:

我正在尝试在寄存器中设置读取观察点。 通过阅读用户手册。我了解如何在寄存器中设置观察点

watch [-l|-location] expr [thread thread-id] [mask maskvalue]

为表达式设置观察点。当表达式 expr 被程序写入并且其值发生变化时,GDB 将中断。

例如:watch $r1。这意味着当程序写入寄存器 r1 并且其值发生变化时,GDB 将中断。有效!

但是当我使用:rwatch $r1时,gdb的回复是"Expression cannot be implemented with read/access watchpoint."

所以我想知道如何在寄存器中设置读取观察点。或者当程序读取寄存器时有什么方法可以打破?

非常感谢!

【问题讨论】:

    标签: debugging gdb breakpoints watchpoint


    【解决方案1】:

    所以我想知道如何在寄存器中设置读取观察点

    我不相信 GDB 提供了这样做的任何便利。

    当您在内存位置设置观察点时,GDB 可以在提供特殊调试寄存器的平台上非常有效地实现它(例如x86_64)。然后程序全速运行,直到访问该位置。

    在不提供调试寄存器的平台上,GDB 必须单步执行程序,并将该位置的值与之前记录的值进行比较。这非常慢(但有时很有用),并且出于明显的原因只能用于写入观察点。

    由于寄存器没有“位置”,当您在寄存器上设置观察点时,GDB 会执行相同的“单步并与之前的值比较”的舞蹈。而且读取观察点根本无法工作。

    您所要求的可以在 GDB 中实现:单步检查每条指令——它是否访问指定的寄存器?

    但是这种需求非常少,而且实现的复杂度也很高,所以我认为没有人愿意真正实现它。

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2018-07-03
      • 2018-03-07
      相关资源
      最近更新 更多