我只是想知道是否可以在变量值更改时设置断点(在任何编程语言和工具中)?
例如,我想说:“当变量 'a' 的值改变时,在任何地方停止”。
我知道可以设置条件断点并在变量具有特定值时停止执行,但我没有听说过观察变量变化。
如果不可能,为什么?
我只是想知道是否可以在变量值更改时设置断点(在任何编程语言和工具中)?
例如,我想说:“当变量 'a' 的值改变时,在任何地方停止”。
我知道可以设置条件断点并在变量具有特定值时停止执行,但我没有听说过观察变量变化。
如果不可能,为什么?
根据我的经验,您可以通过“内存断点”或“内存观察点”来实现这一点。例如 gdb 是这样的:我可以在 GDB 的“内存访问”上设置断点吗?
据我所见,无论新值是否等于旧值,中断实际上a
都会在写入时触发。因此,如果“改变”你真的是指“改变”,那么那里的例子就更少了。可能甚至没有,我不确定,尽管我认为实现仅更改观察点在技术上并不困难,假设您正在实现写入观察点。
对于某些语言,变量的种类有所不同a
。例如,在 C 或 C++ 中,当启用优化时,变量可以“提升”到寄存器中,在这种情况下,变量地址上的硬件内存观察点不一定会捕捉到每个变化。
堆栈上的变量也有一个限制,如果你的函数退出但观察点仍然设置,那么它可以捕获对相同地址的访问,现在用于不同函数中的不同变量。如果稍后(或递归地)再次调用您的函数,它不一定从相同的堆栈位置开始,如果不是,那么您的观察点将无法捕获对不同位置的“相同”变量的访问。
“当特定条件在特定代码行为真时停止”在我的经验中称为“条件断点”。它通常使用不同的机制——调试器很可能会在该代码行放置一个断点指令。每次触发时,调试器都会检查条件,如果为假则继续执行。
一些处理器支持硬件断点,当地址被读取或写入时会中断。例如,如果我在地址 0x10005060 处有一个 4 字节变量,那么我可以像这样设置一个硬件断点(使用 windbg):ba w4 0x10005060。如果写入 4 个字节中的任何一个,处理器将中断。以下命令指示处理器在读取或写入这 4 个字节中的任何一个时中断:ba r4 0x10005060。