2012-04-17 67 views
1

我有一个问题,我似乎无法使用GDB进入一些功能。GDB回溯告诉我符号名称,但不是源文件

我使用了“PIMPL方法”,其中我在.cpp文件中有一个内嵌类,包含您可以通过公开可见的类调用的函数,像这样:

// Foo.cpp 


class FooImpl 
{ 
public: 
    void open() 
    { 
     // ... 
    } 
}; 


Foo::open() 
{ 
    // Impl is a FooImpl* 
    impl->open(); 
} 

使用调试器,我似乎无法步入FooImpl::open()

  • 我确实知道(我使用-fno-inline,我可以看到在组装的call指令)的呼叫没有内联;
  • 我可以在函数内部设置一个断点,GDB可以命中该断点并告诉我它的名字和我的功能。
  • 但是,它不会告诉我源文件(即使它是相同的文件作为Foo :: open())
  • 我不能一步INSIDE函数;当我执行step时,它只是通过呼叫。

这是我的堆栈跟踪看起来像当我在FooImpl::open()电话中的断点:

#0 0x080eee52 in macawi::PowerMateInputImpl::open(std::string)() 
#1 0x080ee766 in macawi::PowerMateInput::open (this=0x83cf204) 
    at ../../app/hal/interfaces/powermateinput_linux.cpp:126 
#2 0x08137455 in macawi::ActorInput::backgroundLoop (this=0x83cf204) 
    at ../../app/common/actors/actorinput.cpp:51 

谁能告诉我为什么GDB不能确定顶部栈帧的源位置,即使它与堆栈帧#1在同一个文件中? (为了记录,我使用了一个在后台使用GDB的图形调试器(Qt Creator),但是当我直接执行GDB时,同样的事情仍然存在)。


编辑:编译命令行看起来是这样的:

g++ -c -pipe -g -O0 -fno-inline -ggdb -fPIC -Wall -W ...(defines, include dirs, object file, source file) 
+0

编译时你传递给gcc什么选项?代码是用-ggdb编译的吗? – 2012-04-17 09:31:55

回答

1

谁能告诉我为什么GDB不能确定顶部堆栈帧的源位置,即使它是在与堆栈帧#1相同的文件

这是一个在GDB或GCC中的错误。

不幸的是,您还没有告诉我们您正在使用哪个版本的GCC和GDB,因此我们甚至无法猜测您需要更新哪些版本。

尝试构建当前的GDB和GCC。如果他们仍然失败,那么写一个小型复制器并用GDB提交一个bug(如果事实证明是GCC的bug,GDB开发者会告诉你)。