如何在寄存器中设置GDB读取观察点?

时间:2018-11-21 16:29:36

标签: debugging gdb breakpoints watchpoint

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

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."

所以我想知道如何在寄存器中设置读取监视点。还是在程序读取寄存器时有任何中断方法?

非常感谢!

1 个答案:

答案 0 :(得分:0)

  

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

我不相信GDB会提供任何便利。

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

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

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

您要的内容可以在GDB中实现:单步执行并检查每条指令-它是否访问命名寄存器?

但是对此的需求非常少,并且实现的复杂性很高,所以我认为没有人愿意实际实现此。