大學四年,自誇努力上進,看了很多專業書,一到實習工做,立刻顯示出菜鳥的本性,連基本的程序調試都不會。大學時程序調試不是用printf輸出運行時變量內容,就是肉眼看代碼,小的算法Demo和功能代碼,這樣子調試就當是賣萌了;工做時一個服務器程序近萬個源代碼文件,客戶端崩潰只有dump文件和日誌信息反饋到服務器上,賣萌式的debug已經沒法知足需求了。這段時間抽空看了一些關於debug的文檔資料,加上工做半年來的一些實踐,在這裏小小的總結一下,大部份內容都是本身在閱讀文檔和實踐中的一些想法,拋磚引玉,一些錯誤和不足,歡迎你們指出。算法
l 程序的debug信息sass
對於編譯器來講(好比gcc),若是直接對程序進行編譯,不保留編譯時的信息,則編譯後的彙編代碼(固然最後是符合操做系統支持的格式的binary可執行文件)根本徹底不知道源代碼的任何信息,不知道彙編代碼與源代碼之間的關係,好比源代碼中的函數名稱、變量的類型和名稱等。好比在使用GDB進行程序調試的時候,step(單步調試)命令默認是不進入共享庫函數(.lib,.so,.a等文件)的,由於共享庫函數都是不帶調試信息的二進制代碼文件,固然共享庫文件通常來講也都是已經調試好了的沒有bug的文件。服務器
在Unix/Linux環境下,使用gcc的-g選項會將調試信息編碼輸出到編譯後的可執行目標代碼文件中,這些調試信息通常來講包括:函數
上面這些信息是確定的,我認爲,應該還包括源代碼和編譯後的彙編代碼之間的對應關係,在如今的編譯技術下,彙編代碼和源代碼之間的一一對應關係徹底不可能從彙編代碼倒推出來了。工具
用一個簡單的31行的C語言Demo程序文件作試驗,使用一樣的編譯優化級別,不使用-g選項編譯出來的可執行目標代碼文件的大小是6.85KB,使用-g選項後編譯出的大小爲8.79KB,而源代碼文件的大小爲404Byte,可見在使用-g選項後在可執行目標代碼文件中調試信息所佔文件大小的比重。當將源文件從當前目錄下刪除後,在調試目標代碼文件時使用list指令,將出現No such file or directory的提示,可見在目標代碼文件中保存的是源文件的路徑信息。性能
在Windows環境中,調試信息並不被編碼到最後的可執行目標文件中,而是經過一個和最後生成的.exe同名的.pdb文件來保存。在使用windbg或者VS來調試Windows下的程序的時候,須要設置和加載相應的.pdb文件,不然給出的調試信息極可能就是錯誤的。相關的信息能夠查看:http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know(PDB Files: What Every Developer Must Know)。學習
另外還有兩點須要說明一下:開發工具
l 一些Tips優化
整篇就是本身的讀書筆記和一些理解,有什麼錯誤,請你們指出。郵箱:wangjian_pg@sohu.com。編碼