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