2012-04-17 85 views
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) 
+0

編譯時你傳遞給gcc什麼選項?代碼是用-ggdb編譯的嗎? – 2012-04-17 09:31:55

回答

1

誰能告訴我爲什麼GDB不能確定頂部堆棧幀的源位置,即使它是在與堆棧幀#1相同的文件

這是一個在GDB或GCC中的錯誤。

不幸的是,您還沒有告訴我們您正在使用哪個版本的GCC和GDB,因此我們甚至無法猜測您需要更新哪些版本。

嘗試構建當前的GDB和GCC。如果他們仍然失敗,那麼寫一個小型複製器並用GDB提交一個bug(如果事實證明是GCC的bug,GDB開發者會告訴你)。