所以我在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
然而,指针的值明显改变了。什么可以解释这个?
感谢。
答案 0 :(得分:1)
watch
命令从概念上观察表达式是否发生变化。使用watch -location
,命令会监视位置是否发生变化(不同之处在于,如果变量超出范围,则watch
将更新其表达式的概念,而-location
不会 - 你通常需要-location
)。
无论如何,请考虑你的表达:
(gdb) wa (TNode<UCSDStudent> **)0x6030b0
这是一个常数。所以,它永远不会改变。
你可能想要:
(gdb) watch -location *(TNode<UCSDStudent> **)0x6030b0