【问题标题】:How to drill down into shared_ptr [Netbeans, clang++, gdb]如何深入研究 shared_ptr [Netbeans、clang++、gdb]
【发布时间】:2015-06-13 17:15:15
【问题描述】:

我正在使用

  • Netbeans C++ 8.0.2
  • clang++(Ubuntu clang 版本 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 是默认的吗?),或者某个地方的设置可能会改善这种情况?或者也许是一种在变量窗口中列出私有成员/原始视图的方法,这样我就可以自己取消引用底层指针?

【问题讨论】:

  • 在 gdb 中: print *0x64d3a0 应该可以完成这项工作。
  • *(base_grammar *)0x64d3a0 似乎是一个工作,虽然不是很方便的工作。

标签: c++ debugging gdb clang netbeans-8


【解决方案1】:

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

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

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

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

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

  1. 在 cmets 中提到 -- 复制并粘贴指针值,转换为正确的类型。这可以可靠地工作,尽管您注意到这是一种痛苦。 Gdb 可能应该对这个惯用语有一些“varobj”支持,这样 IDE 就可以做正确的事情而无需跳过障碍。我相信有一个关于这个的 gdb 错误。

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

【讨论】:

    【解决方案2】:

    在 Netbeans 中:
    单击底部的“Watches”选项卡。现在点击顶部菜单中的运行 > 新手表。
    取消引用您拥有的地址,输入:*0x64d3a0,然后单击确定。

    【讨论】:

    • 有没有办法自动做到这一点?
    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2016-02-10
    相关资源
    最近更新 更多