2015-03-31 142 views
3

我遇到了兩個版本的軟件問題。我有兩個可執行文件(MS和Linux)分別使用MSVC和GCC編譯庫。GDB在MSVC2012和GCC之間打印不同的C++輸出7.3.1

語境:

我的程序包含一個message_queue.hpp模板類,它從message_queue_inter.h接口繼承。該接口包含來自靜態庫的包含。 這兩個庫都經過了O2優化,沒有任何調試信息(調試信息格式 - >無MSVC和-g0 GCC)。事實是,雖然我正在調試兩個可執行文件(在Eclipse中),但GDB可以在我的派生類中找到成員的符號,並在我的MSVC可執行文件中找到基類(接口)(我可以在Eclipse中展開變量內容在調試視圖中)

相反,使用GNU/Linux庫的版本無法找到僅用於接口中成員的符號。 如果我嘗試從我的界面訪問成員,GDB會爲其返回「無數據字段」。派生(.hpp)類的所有成員都會正確顯示。

爲什麼MSCV和GCC編譯器有這樣的區別? 我注意到,當然,MSVC庫比GCC更大。 感謝「nm」工具,我可以注意到接口符號可以在我的MSVC lib中找到,但是在GNU/Linux中找不到。

我知道發佈版本不應包含任何調試信息,但我想知道爲什麼我有權訪問此變量使用MSVC而不是與GCC。 (爲了顯示消息隊列的內容,我需要構建一個最小G2的GCC調試版本來生成更多的符號)。

我迷路了!

感謝您的幫助。

回答

1

大概這是因爲MS版本的/NODEBUG實際上並沒有關閉(全部)調試信息,並且它比0123.上的g ++更爲落後。或者,MS可能正在編寫一個.pdb符號文件,該文件gdb正在查找並閱讀以獲取更詳細的符號信息。

如果您需要調試,我看不到在使用-g2進行編譯時有任何傷害。

+0

謝謝馬克的答案。 PDB文件被有意刪除,所以客戶不需要額外的信息。由於性能和可視性的原因,我們希望避免使我們的靜態庫「調試」。 我想在這種情況下,我們將被迫編譯我們的GNU/Linux庫g2標誌? – David 2015-03-31 15:33:24

+0

更多細節: 我剛剛在我的Windows庫上做了一個dumpbin.exe/ALL,我可以看到相對於我想要訪問的屬性的符號。 但是,當我在我的Linux庫上執行「nm」時,我看不到任何符號屬性。 – David 2015-04-02 14:42:37

0

在發送可執行文件之前,您可以使用'strip'去除符號/調試信息。在運行strip之前和之後,您將擁有兩個版本的可執行文件。你甚至可以調試剝離的executbale,然後使用gdb的`file'命令將gdb指向未剝離的版本。

請注意,-gN或剝離/未剝離不會以任何方式影響可執行文件 - 它只是調試信息部分受到影響。