2010-09-24 23 views
6

我試圖調試由C++二進制生成的核心文件沒有調試符號。爲了進行有效的調試,我需要調試符號,所以我使用-g選項重新編譯了相同的代碼,以便在重新編譯的二進制文件中生成調試符號。現在可以使用第二個二進制文件(具有調試符號,其他所有內容都是相同的)來調試由第一個二進制文件生成的相同核心文件(不帶調試符號)嗎?我可以調試由C++二進制生成的核心,而不使用調試符號使用與調試符號重新編譯相同的二進制

非常感謝!

回答

5

如果您編譯了原始的可執行文件, g++ -O2 ...,你不能(因爲你可能已經發現)使用g++ -g ...構建的新的可執行文件來調試core - GDB需要匹配的符號,他們不會(由於優化級別的差異)。

什麼你可以做的是建立新的可執行文件具有相同優化爲原創,但也調試符號:g++ -O2 -g ...

在創建新的可執行文件之後,運行nm old.a.out > old.nmnm new.a.out > new.nm並比較輸出。它們應該相同或非常非常接近。

如果是這樣,你應該能夠使用new.a.out調試由old.a.out生成的core

在未來,你應該總是建立與調試符號的可執行文件,然後保持完整副本,但船副本沒有調試信息:

cp a.out a.out.debug 
strip --strip-debug a.out 
# a.out is now good to send to customers 
# keep a.out.debug for future debugging