1

我有一个问题,我似乎无法使用 GDB 进入某些功能。

我正在使用“PImpl idiom”,其中我的 .cpp 文件中有一个内联类,其中包含从公开可见的类中调用的函数,如下所示:

// Foo.cpp


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


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

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

  • 我确定调用不是内联的(我正在使用-fno-inline并且我可以call在程序集中看到指令);
  • 我可以在函数内部设置一个断点,GDB 可以点击该断点并告诉我它的名称和我所在的函数。
  • 但是,它不会告诉我源文件(即使它与 Foo::open() 是同一个文件)
  • 我无法进入该功能;当我执行时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)
4

1 回答 1

1

谁能告诉我为什么 GDB 无法确定顶部堆栈帧的源位置,即使它与堆栈帧 #1 在同一个文件中

这是一个错误,无论是在 GDB 中还是在 GCC 中。

不幸的是,您还没有告诉我们您使用的是哪个版本的 GCC 和 GDB,所以我们甚至无法开始猜测您可能需要更新到哪些版本。

尝试构建当前的 GDB 和 GCC。如果仍然失败,请编写一个小型复制器并向 GDB 提交错误(如果结果证明是 GCC 错误,GDB 开发人员会告诉您)。

于 2012-04-17T16:02:24.900 回答