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