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 或类似的。没有办法深入到它实际指向的价值。即使“变量”窗口中的树视图显示一个扩展图标,当我单击它时,
- clang++(Ubuntu clang版本3.6.0-2ubuntu1(标签/发布版\ 360/最终版)(基于LLVM 3.6.0))
- gdb(GNU gdb(Ubuntu 7.9-1ubuntu1)7.9)
get()
函数时,我收到一条错误消息:
找不到运算符*
及
无法计算函数--可能是内联函数
分别
如果我在实际的程序中创建一个对值的引用,它不仅允许我向下钻取引用,而且还可以向下钻取共享的\u ptr(我觉得这很可疑)。我尝试了-g3
和-ggdb
,但没有效果
是否有标准库的调试版本(libcxx是默认版本吗?),或者有可能改善这种情况的设置?或者是在变量窗口中列出私有成员/原始视图的一种方法,这样我就可以自己取消对底层指针的引用了?在Netbeans中:
单击底部的“监视”选项卡。现在单击顶部菜单中的“运行>新建手表”。
取消引用您拥有的地址,键入:
*0x64d3a0
,然后单击“确定”。gdb的一个缺陷是,漂亮的打印代码仅用于打印,不能用于深入挖掘。此缺陷还影响“varobj”特性,这是大多数GUI在与gdb就值显示进行通信时使用的特性
有一些可能性可以让这一切变得更好
首先,一点背景知识。不能调用操作符*
或get
的原因是gcc通常不会发出总是内联的函数的越行副本。这是一个节省空间的优化。(您可以请求这样做,但这是非常罕见的。)
因此,解决这个问题的一种方法是新的ish gdbxmethod
code。您可以在gdb中编写一些Python代码,让您实现像get
这样的功能,这样gdb表达式将按预期工作,即使编译器不配合。这很方便!libstdc++附带了其中一些,虽然我不知道具体是什么;你得去挖了
我经常使用两种低技术方法
在gdb中:print*0x64d3a0应该完成这项工作。执行
*(基本语法*)0x64d3a0
似乎是一项工作,但不是很方便。没有办法自动完成这项工作吗?