【问题标题】:GDB backtrace tells me symbol name but not source fileGDB 回溯告诉我符号名称而不是源文件
【发布时间】:2012-04-17 09:25:53
【问题描述】:

我有一个问题,我似乎无法使用 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)

【问题讨论】:

  • 编译时传递给 gcc 的选项有哪些?代码是用-ggdb编译的吗?

标签: c++ gdb


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2019-10-15
    • 1970-01-01
    相关资源
    最近更新 更多