首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用gdb检查boost shared_ptr

使用gdb检查boost shared_ptr
EN

Stack Overflow用户
提问于 2013-07-23 16:22:47
回答 3查看 12.1K关注 0票数 20

以下是我的源代码:

代码语言:javascript
复制
#include <iostream>
#include <boost/shared_ptr.hpp>

class MyClass
{
    public:
        MyClass()
        {
            i=10;
        }
    private:
        int i;
};


int main(int argc, const char *argv[])
{
    boost::shared_ptr <MyClass> obj(new MyClass());
    return 0;
}

我想在gdb中检查obj,并查看成员变量i的值。

这是我用普通打印得到的结果:

代码语言:javascript
复制
29          boost::shared_ptr <MyClass> obj(new MyClass());
(gdb) n
30          return 0;
(gdb) p obj
$1 = {px = 0x602010, pn = {pi_ = 0x602030}}

我尝试了this link中提到的提示,但不起作用。

代码语言:javascript
复制
(gdb) call (obj.get())->print()
Cannot evaluate function -- may be inlined

还有别的办法吗?gdb版本为7.0.1。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-07-23 18:06:08

明白了。!

代码语言:javascript
复制
(gdb) set print pretty
(gdb) p obj
$5 = {
  px = 0x602010,
  pn = {
    pi_ = 0x602030
  }
}
(gdb) p obj.px
$6 = (MyClass *) 0x602010



(gdb) p *(obj.px)
$7 = {
  i = 10
}
票数 30
EN

Stack Overflow用户

发布于 2013-07-23 16:27:33

这将是一个很难回答的问题。GDB 7.x增加了对Python脚本的支持。网上有一些资源。我不会做一个糟糕的尝试来建议我没有第一次经验的东西,我会推荐你参考过去的帖子:

C++ GDB Python Pretty Printing Tutorial?

票数 0
EN

Stack Overflow用户

发布于 2013-07-23 16:36:05

编译时使用-ggdb选项,看看是否有效

http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html

内联是一种优化,它直接在每个调用点插入函数体的副本,而不是跳到共享例程。gdb像显示非内联函数一样显示内联函数。它们以回溯的形式出现。您可以查看它们的参数和局部变量,使用step进入它们,使用next跳过它们,使用finish退出它们。您可以使用info frame命令检查函数是否内联。

为了让gdb支持内联函数,编译器必须在调试信息中记录有关内联的信息-使用dwarf 2格式的gcc可以做到这一点,其他几个编译器也可以做到这一点。gdb仅支持使用dwarf 2时的内联函数。4.1之前的版本的gcc不会发出两个必需的属性(‘DW_AT_call_file’和‘DW_AT_call_line’);gdb不会显示较早版本的gcc的内联函数调用。相反,它将内联函数的参数和局部变量显示为调用方中的局部变量。

内联函数体直接包含在其调用位置;与非内联函数不同,没有专门用于调用的指令。gdb仍然假装调用点和内联函数的开始是不同的指令。单步执行到调用站点显示调用站点,然后再次单步执行显示内联函数的第一行,即使没有执行任何额外的指令。

这使得源代码级别的调试更加清晰;您既可以看到调用的上下文,也可以看到调用的效果。仅使用stepi或nexti单步执行一条指令并不能做到这一点;单指令步骤总是显示内联的主体。

gdb在某些方面不会假装内联函数调用与普通调用相同:

在内联函数的调用位置设置断点可能不起作用,因为调用位置不包含任何代码。在调用之后,gdb可能会错误地将断点移动到封闭函数的下一行。这一限制将在未来的gdb版本中删除;在此之前,请在较早的行或内联函数内设置断点。使用finish命令后,gdb找不到内联调用的返回值。这是编译器生成的调试信息的限制;完成后,您可以跳到下一行并打印一个变量,程序将在该变量中存储返回值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17804967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档