2012-06-04 29 views
1

我在Solaris調試正在運行的程序與GDB 6.6,並注意到有時用gdb步入(內聯)功能,即使我發了下一個命令。 我的開發主機最近重新安裝了solaris 10的一個稍微更新的版本,並且我確定自動步進在主機重新安裝之前不存在。代碼使用相同的選項進行編譯,因爲在主機重新安裝後,makefile和所有源代碼都保持不變。GDB自動步入內聯函數

是否有任何影響gdb調試行爲的設置/新的默認選項,我可以檢查?有誰知道爲什麼我的gdb現在自動步驟?它真的很痛...

[編輯]澄清:我不是指inline關鍵字,而是在頭文件中實現的方法/函數。示例:

header.hpp: 
class MyClass 
{ 
    public: 
     void someFunc() { ... does something } 
} 

source.cc: 
{ 
    MyClass instance; 

    instance.someFunc();  // doing NEXT in gdb will actually STEP into header.hpp 
} 
+0

愚蠢的問題,但你確定你沒有任何斷點或任何內部被調用的功能? –

+0

是的,非常確定。它在執行「cont」時不會中斷。 – user826955

回答

4

您的新版本的Solaris可能包含新版本的C或C++編譯器。新的編譯器可能比以前更積極地進行優化。檢查你的優化標誌。如果您正在使用GCC,則可以使用-fno-inline禁用內聯(請注意,頭文件中的類中實現的方法默認爲內聯,可使用-fno-default-inline禁用)。如果您使用本地Solaris編譯器,則需要檢查其文檔。

類似的問題報告爲here。在評論中,海報提到改變調試符號以使用STABS解決了這個問題。

您在評論中提到STABS有效,但不能接受。另外,你提到你無法用一個簡單的例子重現這個問題。如果您每次都必須重新編譯整個項目來執行測試,那麼解決此問題將很困難。嘗試將問題隔離到項目中的幾個源文件。看看它們有什麼共同之處(它們是否包含共同的頭文件,它們是否使用pragma,是否與其他源文件等有所不同),並嘗試創建一個具有相同問題的小示例。這樣可以更輕鬆地找出問題的根源,並確定如何解決問題。沒有這些數據,我們就是盲人領導盲人。

+0

對不起,我不是指'inline'關鍵字。編輯上面的問題來澄清。 – user826955

+0

當我還在gcc 3.4.6上時,這仍然可以由更多的編譯器優化引起嗎? – user826955

+0

其實我不知道gdb的版本是否不同(我無法檢查這個,主機是由於系統故障重新安裝的)。但我的印象是海灣合作委員會的版本應該是相同的,因爲它仍然是3.4.6,也許沒有一個「更新的」3.4.6版本?我們被迫從'Solaris 10 10/08 s10x_u6wos_07b'升級到'Oracle Solaris 10 8/11 s10x_u10wos_17b',這是可用的最老版本的solaris 10。我知道至少libc.so.1是不同的,因爲我們遇到了將二進制文件部署到版本爲「Solaris 10 10/08 s10x_u6wos_07b」的舊版本生產主機時的問題。 – user826955