GDB硬件观察点是如何工作的?



我对如何实现硬件观察点很感兴趣。如果我通过watch varName观察uint8_t变量(watch ->写手表),所以在任何情况下,任何数据被改变在任何位的内存位置范围内,它将被检测到?

GDB如何处理内存位置/范围?

我对如何实现硬件观察点很感兴趣。

在支持硬件观察点的平台上,GDB使用启用它们的处理器特性(呸!)。

例如,在x86上,有特殊的调试寄存器,当地址总线与给定地址匹配并且访问是写(用于观察点),读(用于实现访问观察点)等时,可以将其编程为处理器停止执行。

如果我观察uint8_t变量…在内存位置范围内的任何位上更改任何数据都将被检测到?

x86处理器不将单个写入内存。你至少能写一个字节。处理器将在写入字节后停止(如果调试寄存器是这样配置的)。然后GDB可以比较新值和旧值,如果它们不同,则停止执行(否则GDB将吞下观察点并继续执行,就像什么都没有发生一样)。

是的,这可以在单位更改上工作-它所需要的只是GDB记住旧值(当您设置断点时它会这样做)。

注意:这里有一些空白——如果该值被内核改变(例如,作为read系统调用的结果),GDB观察点将在发生这种情况时不会停止。

最新更新