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)
编译时你传递给gcc什么选项?代码是用-ggdb编译的吗? – 2012-04-17 09:31:55