如何深入研究shared_ptr [Netbeans,clang ++,gdb]

Bre*_*ent 5 c++ debugging gdb clang netbeans-8

我正在使用

  • Netbeans C++ 8.0.2
  • clang ++(Ubuntu clang version 3.6.0-2ubuntu1(tags/RELEASE_360/final)(基于LLVM 3.6.0))
  • gdb(GNU gdb(Ubuntu 7.9-1ubuntu1)7.9)

在我的"C++简单测试"中,每当我检查一个shared_ptr变量时,我看到的所有值都是:

std :: shared_ptr(count 1,weak 0)0x64d3a0

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

找不到运营商*.

无法评估功能 - 可能内联

分别.

如果我在实际程序中创建对该值的引用,它不仅允许我深入查看引用,而且也可以向下钻取shared_ptr(这对我来说似乎很可疑).我尝试过-g3,-ggdb但没有任何区别.

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

Tom*_*mey 2

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

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

首先,介绍一些背景知识。无法调用operator*or 的原因get是 gcc 通常不会发出始终内联的函数的外联副本。这是一种节省空间的优化。(您可以要求这样做,但这种情况并不常见。)

因此,解决此问题的一种方法是使用新的 gdbxmethod代码。您可以在 gdb 中编写一些 Python 代码来实现类似的功能get,这样即使编译器不配合,gdb 表达式也能按预期工作。这很方便!libstdc++ 附带了其中一些,尽管我不知道具体是什么;你必须去挖掘。

我经常使用两种低技术含量的方法。

  1. 评论中提到——复制并粘贴指针值,转换为正确的类型。尽管正如您所指出的,这很痛苦,但它工作可靠。Gdb 应该对这个习惯用法有一些“varobj”支持,这样 IDE 就可以做正确的事情,而不必费力。我相信有一个与此相关的 gdb bug。

  2. 绕过漂亮的打印机并直接深入研究对象表示。这有时会令人不快——特别是在 libstdc++ 中,有时对象表示确实不明显——但对于像智能指针这样的东西来说,它应该不会太糟糕。其秘诀就是print/r,然后检查您所看到的内容。IDE 也可以而且应该提供一种绕过漂亮打印的方法,“varobj”API 公开了此功能。我不知道Netbeans是否支持。