在变量值更改时设置断点



我只是想知道是否可以在变量值更改时设置断点(在任何编程语言和工具中)?

例如,我想说:"当变量‘a’的值将被更改时,停止任何位置"。

我知道有能力设置条件断点,并在变量有特定值时停止执行,但我没有听说过观察变量的变化。

如果不可能,为什么?

根据我的经验,您可以通过"内存断点"或"内存观察点"来实现这一点。例如gdb是这样做的:我可以在';内存访问';在GDB?

就我所看到的写入观察点而言,无论新值是否等于旧值,当a写入时,中断实际上都会触发。因此,如果你所说的"改变"真的是指"改变",那么例子就更少了。我不确定,甚至可能没有,尽管我不认为在技术上实现仅更改的观察点会很困难,假设您正在实现写观察点。

对于某些语言来说,a是什么样的变量是有区别的。例如,在C或C++中,当启用优化时,变量可以"提升"到寄存器中,在这种情况下,变量地址上的硬件内存监视点不一定能捕捉到每一个变化。

堆栈上的变量也有一个限制,即如果您的函数退出,但观察点仍在设置中,则它可以捕获对同一地址的访问,该地址现在用于不同函数中的不同变量。如果稍后(或递归)再次调用您的函数,则它不一定从同一堆栈位置开始,如果不是,则您的观察点将无法在不同位置捕获对"相同"变量的访问。

根据我的经验,"在特定代码行中特定条件为true时停止"被称为"条件断点"。它通常使用不同的机制——调试器很可能会在这行代码中放入断点指令。每次触发时,调试器都会检查条件,如果条件为false,则继续执行。

一些处理器支持硬件断点,当读取或写入地址时,硬件断点会中断。例如,如果我在地址0x10005060处有一个4字节的变量,那么我可以设置这样的硬件断点(使用windbg):ba w4 0x10005060。如果写入了4个字节中的任何一个,则处理器将中断。以下命令指示处理器在读取或写入这4个字节中的任何一个时中断:ba r4 0x10005060。

最新更新