gpt4 book ai didi

c++ - GDB 回溯告诉我符号名称而不是源文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:11 24 4
gpt4 key购买 nike

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

最佳答案

Can anyone tell me why GDB can't determine the source location of the top stack frame, even though it's in the same file as stack frame #1

这是 GDB 或 GCC 中的错误。

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

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

关于c++ - GDB 回溯告诉我符号名称而不是源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10188567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com