Bre*_*ent 5 c++ debugging gdb clang netbeans-8
我正在使用
在我的"C++简单测试"中,每当我检查一个shared_ptr变量时,我看到的所有值都是:
std :: shared_ptr(count 1,weak 0)0x64d3a0
或类似的.没有办法深入到它实际指向的值.即使变量窗口中的树视图显示其中一个扩展器图标,当我单击它时它也会消失.当我尝试解除引用它或get()
在"表达式"窗口中调用它的函数时,我收到一条错误消息:
找不到运营商*.
和
无法评估功能 - 可能内联
分别.
如果我在实际程序中创建对该值的引用,它不仅允许我深入查看引用,而且也可以向下钻取shared_ptr(这对我来说似乎很可疑).我尝试过-g3
,-ggdb
但没有任何区别.
是否有标准库的调试版本(libcxx是默认值?),还是某个可能改善情况的设置?或者也许是一种在变量窗口中列出私有成员/原始视图的方法,所以我可以自己取消引用底层指针?
gdb 的一个缺陷是漂亮打印代码仅用于打印,不能用于更深层次的挖掘。此缺陷还会影响“varobj”功能,这是大多数 GUI 在与 gdb 进行值显示通信时使用的功能。
有一些可能性可以让这一切变得更好。
首先,介绍一些背景知识。无法调用operator*
or 的原因get
是 gcc 通常不会发出始终内联的函数的外联副本。这是一种节省空间的优化。(您可以要求这样做,但这种情况并不常见。)
因此,解决此问题的一种方法是使用新的 gdbxmethod
代码。您可以在 gdb 中编写一些 Python 代码来实现类似的功能get
,这样即使编译器不配合,gdb 表达式也能按预期工作。这很方便!libstdc++ 附带了其中一些,尽管我不知道具体是什么;你必须去挖掘。
我经常使用两种低技术含量的方法。
评论中提到——复制并粘贴指针值,转换为正确的类型。尽管正如您所指出的,这很痛苦,但它工作可靠。Gdb 应该对这个习惯用法有一些“varobj”支持,这样 IDE 就可以做正确的事情,而不必费力。我相信有一个与此相关的 gdb bug。
绕过漂亮的打印机并直接深入研究对象表示。这有时会令人不快——特别是在 libstdc++ 中,有时对象表示确实不明显——但对于像智能指针这样的东西来说,它应该不会太糟糕。其秘诀就是print/r
,然后检查您所看到的内容。IDE 也可以而且应该提供一种绕过漂亮打印的方法,“varobj”API 公开了此功能。我不知道Netbeans是否支持。