我正在尝试在寄存器中设置读取监视点。 通过阅读用户手册。我了解了如何在寄存器中设置观察点
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."
所以我想知道如何在寄存器中设置读取监视点。还是在程序读取寄存器时有任何中断方法?
非常感谢!
答案 0 :(得分:0)
所以我想知道如何在寄存器中设置读取监视点
我不相信GDB会提供任何便利。
在内存位置上设置观察点时,GDB可以在提供特殊调试寄存器(例如x86_64
)的平台上非常有效地实现它。然后,程序将全速运行,直到访问该位置为止。
在不提供调试寄存器的平台上,GDB必须单步执行程序,并将该位置的值与先前记录的值进行比较。这非常慢(但有时很有用),并且出于明显的原因只能用于写观察点。
由于寄存器没有“位置”,因此当您在寄存器上设置观察点时,GDB会执行相同的“单步并与以前的值进行比较”的操作。而且读取观察点根本无法工作。
您要的内容可以在GDB中实现:单步执行并检查每条指令-它是否访问命名寄存器?
但是对此的需求非常少,并且实现的复杂性很高,所以我认为没有人愿意实际实现此。