c++ - gdb 观察点未检测到变量的变化

标签 c++ debugging gdb

所以我在 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/

相关文章:

javascript - 无法使用 Node 检查器进行调试 - 出了什么问题?

c++ - KDevelop调试警告: Failed to set controlling terminal: Operation not permitted

javascript - 自动打开 Web Inspector 弹出窗口?

在 gdb 中查找环境变量地址时的奇怪事情

linux - 如何使用 gdb 调试帧缓冲区应用程序

c++ - 运算符优先级

c++ - 用字符串中的空格替换符号

assembly - 在GDB(实模式,依附于QEMU)中,在特定条件下的特定点stepo和nexti似乎打破了断点机制

c++ - 处理两个彼此接近的 double 相减时的精度损失

c++ - 用 C/C++ 包装 Mac OS X 特定代码的宏