C++ 如何深入到共享的ptr[Netbeans,clang+;+;,gdb]

C++ 如何深入到共享的ptr[Netbeans,clang+;+;,gdb],c++,debugging,gdb,clang,netbeans-8,C++,Debugging,Gdb,Clang,Netbeans 8,我正在使用 NebBeaseC++ +0.0.2 clang++(Ubuntu clang版本3.6.0-2ubuntu1(标签/发布版\ 360/最终版)(基于LLVM 3.6.0)) gdb(GNU gdb(Ubuntu 7.9-1ubuntu1)7.9) 在我的“C++简单测试”中,每当我检查一个共享的变量时,我看到的所有值都是: std::共享ptr(计数1,弱0)0x64d3a0 或类似的。没有办法深入到它实际指向的价值。即使“变量”窗口中的树视图显示一个扩展图标,当我单击它时,

我正在使用

    NebBeaseC++ +0.0.2
  • clang++(Ubuntu clang版本3.6.0-2ubuntu1(标签/发布版\ 360/最终版)(基于LLVM 3.6.0))
  • gdb(GNU gdb(Ubuntu 7.9-1ubuntu1)7.9)
在我的“C++简单测试”中,每当我检查一个共享的变量时,我看到的所有值都是:

std::共享ptr(计数1,弱0)0x64d3a0

或类似的。没有办法深入到它实际指向的价值。即使“变量”窗口中的树视图显示一个扩展图标,当我单击它时,它也会消失。当我尝试在“表达式”窗口中取消引用它或调用它的
get()
函数时,我收到一条错误消息:

找不到运算符*

无法计算函数--可能是内联函数

分别

如果我在实际的程序中创建一个对值的引用,它不仅允许我向下钻取引用,而且还可以向下钻取共享的\u ptr(我觉得这很可疑)。我尝试了
-g3
-ggdb
,但没有效果


是否有标准库的调试版本(libcxx是默认版本吗?),或者有可能改善这种情况的设置?或者是在变量窗口中列出私有成员/原始视图的一种方法,这样我就可以自己取消对底层指针的引用了?

在Netbeans中:
单击底部的“监视”选项卡。现在单击顶部菜单中的“运行>新建手表”。

取消引用您拥有的地址,键入:
*0x64d3a0
,然后单击“确定”。

gdb的一个缺陷是,漂亮的打印代码仅用于打印,不能用于深入挖掘。此缺陷还影响“varobj”特性,这是大多数GUI在与gdb就值显示进行通信时使用的特性

有一些可能性可以让这一切变得更好

首先,一点背景知识。不能调用
操作符*
get
的原因是gcc通常不会发出总是内联的函数的越行副本。这是一个节省空间的优化。(您可以请求这样做,但这是非常罕见的。)

因此,解决这个问题的一种方法是新的ish gdb
xmethod
code。您可以在gdb中编写一些Python代码,让您实现像
get
这样的功能,这样gdb表达式将按预期工作,即使编译器不配合。这很方便!libstdc++附带了其中一些,虽然我不知道具体是什么;你得去挖了

我经常使用两种低技术方法

  • 注释中提到--复制并粘贴指针值,强制转换为正确的类型。这是可靠的,但正如你所注意到的,这是一种痛苦。Gdb应该对这个习惯用法有一些“varobj”支持,这样IDE就可以做正确的事情而不必操之过急。我相信这里面有一个gdb漏洞

  • 绕过漂亮的打印机,直接挖掘对象表示。这有时会令人不快——特别是在libstdc++中,有时对象表示确实不明显——但对于智能指针之类的东西来说,这应该不会太糟糕。这方面的诀窍就是打印/r,然后检查您看到的内容。IDE也可以而且应该提供一种绕过漂亮打印的方法,“varobj”API公开了这种功能。我不知道Netbeans是否会


  • 在gdb中:print*0x64d3a0应该完成这项工作。执行
    *(基本语法*)0x64d3a0
    似乎是一项工作,但不是很方便。没有办法自动完成这项工作吗?