1

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

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

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

非常感谢!

4

1 回答 1

0

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

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

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

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

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

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

但是这个需求非常少,实现的复杂度也很高,所以我认为没有人愿意实际实现这个。

于 2018-11-22T04:34:38.923 回答