所以我在 GDB 中运行一个程序,我为某个变量(具体来说是一个对象指针)设置了一个观察点,该变量存在于地址 0x6030b0:
(gdb) wa (TNode<UCSDStudent> **)0x6030b0
Watchpoint 7: (TNode<UCSDStudent> **)0x6030b0
我知道指针的值:
(gdb) p/x *((TNode<UCSDStudent> **)0x6030b0)
$5 = 0x603130
我在第 115 行设置了一个断点,我的程序结束了。然后我继续这个断点:
(gdb) c
Continuing.
No more reverse-execution history.
main (argc=2, argv=0x7fffffffd9a8) at Driver.c:115
115 ST.Write( cout << "\nFinal Symbol Table:\n" );
这意味着指针的值没有改变,因为 gdb 没有在任何观察点停止。我现在打印指针的值:
(gdb) p/x *((TNode`<UCSDStudent>` **)0x6030b0)
$6 = 0x0
但是,指针的值显然确实发生了变化。这有什么可以解释的?
谢谢。
最佳答案
watch
命令在概念上会监视表达式是否发生变化。使用 watch -location
,该命令会监视位置是否发生变化(不同之处在于,如果变量超出范围,普通 watch
将更新它的想法表达式,而 -location
不会——您通常需要 -location
)。
无论如何,考虑一下你的表达方式:
(gdb) wa (TNode<UCSDStudent> **)0x6030b0
这是一个常数。所以,它永远不会改变。
你可能想要:
(gdb) watch -location *(TNode<UCSDStudent> **)0x6030b0
关于c++ - gdb 观察点未检测到变量的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35682896/