在变量值更改上设置断点

时间:2012-09-24 13:29:15

标签: debugging language-agnostic

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

例如,我想说:“当变量'a'的值被改变时,停在任何地方。”

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

如果不可能,为什么?

2 个答案:

答案 0 :(得分:7)

根据我的经验,您可以通过“内存断点”或“内存观察点”实现此目的。例如,gdb就是这样的:Can I set a breakpoint on 'memory access' in GDB?

就我所见的写入观察点而言,无论新值是否等于旧值,当a 写入时,实际上会触发中断。因此,如果“改变”你真的意味着“改变”那么那里的例子就会少一些。可能甚至没有,我不确定,虽然我不认为在技术上难以实现仅限更改的观察点,假设您正在实施写观察点。

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

堆栈上的变量也存在限制,如果您的函数退出但仍然设置了监视点,那么它可以捕获对同一地址的访问,现在用于不同函数中的不同变量。如果稍后(或递归地)再次调用您的函数,它不一定从相同的堆栈位置开始,如果没有,那么您的观察点将无法捕获对不同位置的“相同”变量的访问。

“在特定代码行中特定条件为真时停止”在我的经验中被称为“条件断点”。它通常使用不同的机制 - 调试器很可能会在该行代码中放置断点指令。每次触发调试器时都会检查条件并继续执行,如果它是假的。

答案 1 :(得分:1)

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