【问题标题】:How to access target of std::tr1::shared_ptr in GDB如何在 GDB 中访问 std::tr1::shared_ptr 的目标
【发布时间】:2014-09-15 01:19:03
【问题描述】:

如何在 GDB 中访问 std::tr1::shared_ptr 的目标。这不起作用:

(gdb) p sharedPtr->variableOfTarget

如果我尝试使用指针对象本身 (p sharedPtr),我会得到如下结果:

$1 = std::tr1::shared_ptr (count 2) 0x13c2060

使用普通指针,我可以通过 p *ptr 获取所有数据,或者通过 p ptr->variable 获取一个变量。

我使用的是 Centos 6.5、GCC 4.4.7-4.el6 和 GDB 7.2-64.el6_5.2。

【问题讨论】:

  • 您使用的是哪个编译器和标准库?还有哪个版本的 GDB?
  • @Alastair 对不起!更新了我的问题。
  • 你试过(gdb) p sharedPtr.get()吗?
  • @Raydel Miranda 成功了!非常感谢!我稍后会添加答案。
  • 我还不能回答我自己的问题,因为我的名声太小了。这是有效的:p (*sharedPtr.get()) 打印目标对象的内容,p (*sharedPtr.get())->variableOfTarget 将打印单个变量。有趣的是,如果你省略像 p *sharedPtr.get() 这样的括号,它也会推进程序的执行。有人可以解释这是为什么吗?

标签: c++ gdb shared-ptr tr1


【解决方案1】:

ptr->get() 并不总是有效。

当我尝试 ptr->get() 时,gdb 抱怨:无法将方法 ***:get() 解析为任何重载实例

我最终去/usr/include/找到shared_ptr的源代码来查看私有成员。

原来是这样的

ptr._M_ptr

它对我有用。源代码适用于所有人。

【讨论】:

  • 你的意思是 ptr.get() 对吧?我认为运算符-> 不是您要在这里使用的。
  • ptr->get() 表示 *ptr.get()。
  • 不,不一样,ptr->get() 尝试从 shared_ptr 指向的任何地方调用 get 函数,*ptr.get() 正在取消引用该指针。 . 运算符在这里有偏好。 *ptr.get()*(ptr.get()) 相同。
【解决方案2】:

试试

(gdb) p (*sharedPtr.get())

该函数返回指向智能指针所拥有对象的 a 指针。

【讨论】:

  • 您必须在前面使用星号才能访问指针目标,并且出于某种原因还需要像这样的括号:(*sharedPtr.get())。请参阅我对问题的评论。
  • 如果我使用这个解决方案,我会得到(gdb) p (*self.get()) You can't do that without a process to debug.
【解决方案3】:

先回答:

p *frame._M_ptr # frame is the shared_ptr's name

我试过p (*frame.get()),但没用(frame 是我的 shared_ptr 名称)

(gdb) p frame
$4 = std::shared_ptr (count 2, weak 0) 0x2ea3080
(gdb) p (*frame.get())
Cannot evaluate function -- may be inlined

然后我试图获取这个 shared_ptr 中的内容,然后我找到了这个

(gdb) p frame.
_M_get_deleter  __shared_ptr    operator*       reset           unique          ~shared_ptr     
_M_ptr          get             operator->      shared_ptr      use_count       
_M_refcount     operator bool   operator=       swap            ~__shared_ptr   

我使用了它的 _M_ptr 字段,它起作用了。

(gdb) p *frame._M_ptr 
$5 = {
...
}

我使用了 std::shared_ptr 和 gdb 7.6。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 1970-01-01
    • 2012-03-01
    • 2011-10-29
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2011-08-01
    • 2015-08-23
    相关资源
    最近更新 更多