gpt4 book ai didi

c++ - 如何深入研究 shared_ptr [Netbeans、clang++、gdb]

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:38:51 26 4
gpt4 key购买 nike

我正在使用

  • 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

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

Could not find operator*.

Cannot evaluate function -- may be inlined

分别。

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

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

最佳答案

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

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

首先,介绍一下背景。您不能调用 operator*get 的原因是 gcc 通常不会发出始终内联的函数的外联拷贝。这是一个节省空间的优化。 (您可以要求发生这种情况,但这种情况并不常见。)

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

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

  1. 评论中提到 -- 复制并粘贴指针值,转换为正确的类型。这工作可靠,但正如您所注意到的那样很痛苦。 Gdb 可能应该对这个习惯用法有一些“varobj”支持,这样 IDE 就可以做正确的事情而不会跳过箍。我相信有一个关于此的 gdb 错误。

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

关于c++ - 如何深入研究 shared_ptr [Netbeans、clang++、gdb],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30821402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com