對於很多程式設計師朋友來說,編寫**要比除錯**快樂的多。似乎創造軟體比維護軟體更能給人帶來成就感。然而,在企業裡面維護前人留下的**也是工作中不可缺少的一項內容。所以,如何除錯軟體,更快更好地尋找軟體中的bug,就成了我們必須學習的一門功課。當然,有人查詢故障很快,而有的人卻要慢一點,這中間的原因很多,比如說對業務的熟悉程度,對除錯工具的使用程度。這也從一方面說明了,掌握軟體除錯的技巧是十分重要的。這裡討論的內容,不是指怎麼用visual studio或者是gdb、kgdb、systemtap除錯,而是說說除錯軟體的基本原理是什麼。說到底,除錯軟體也是軟體,它需要晶元、作業系統、編譯軟體、堆疊格式的支援。
(1)晶元的支援
(2)作業系統的支援
晶元本身只是負責產生異常,尋找到異常處理函式,至於這樣的函式還要做些什麼,那就是作業系統要負責的事情了。比如說,現在我們要除錯的程式已經執行到斷點了,那麼作業系統就要通知gdb或者visual studio當前的程式已經執行到節點了,接下來要做什麼。在一般的軟體除錯中,功能其實都大同小異,比如說檢視暫存器、檢視記憶體、設定斷點、取消斷點、檢視執行緒號、繼續執行等等。這些都需要作業系統本身的支援,否則作為使用者側的gdb怎麼知道當前的除錯程式執行到什麼地方了,它的基本資訊在**等等。畢竟,gdb本身也是乙個軟體,它關於除錯程式的具體資訊都是別人告訴它的,它又不是神。
(3)編譯軟體的支援
有了晶元和作業系統的支援,其實就可以除錯軟體了,比如說wingdb就是這麼幹的。但是,我們還不是很滿足,為什麼?因為有的時候,我們還需要知道函式的引數值、全域性變數是多少,有沒有發生改變,c語言**有沒有對應的彙編**,能否實現彙編級的除錯等等。當然,這些資訊對於執行檔案本身的執行其實是無關緊要的,只是我們為了除錯軟體的時候使用的。所以,在visual studio編譯的軟體版本當中有debug版本,有release版本之分;有普通的軟體版本,有優化的軟體版本。在linux上,人們為了除錯的需要,也會在gcc除錯的選項中新增-g選項,獲得額外的除錯資訊。
(4)堆疊的支援
在除錯軟體中,有一項非常棒的內容,那就是函式堆疊檢視功能。堆疊會根據臨時變數的新增、減少進行浮動處理。可以說掌握了堆疊就掌握了cpu、掌握了程式設計、掌握了軟體除錯。在x86中,ebp是比較神奇的暫存器。在堆疊中,ebp[0]儲存了上乙個ebp的位址,ebp[1]儲存了返回函式的位址。通過迭代,就可以的得到所有的函式指標了。當然,通過編譯器可以生成軟體的systemp map檔案,也就記錄所有函式的空間位址。把返回位址和system map聯絡在一起,我們就可以知道當前**的函式堆疊了。除此之外,我們還可以利用堆疊中的返回位址設定斷點,這樣可以在當前函式執行到結束的時候斷住,使用起來也是十分方便。
void print_function_addr(int ebp, int level)
}
(5)日誌和計數器
依靠系統本身的除錯軟體當然是不夠的,所以為了看清資料的執行流程,我們還需要獲得一些額外的除錯資訊了。所以,對於業務而言,我們需要按照告警、錯誤、資料格式分別進行日誌儲存。當然,有時候我們還要對業務效能、頻率進行衡量和比較,所以很多時候計數器也是必不可少的。這些資訊都是正常**之外的額外資訊,所以處理好他們和普通**之間的關係也是一門大學問。同時,日誌有時還要受到多執行緒、效率、異常等因素的影響,所以思考和執行的時候一定要顧慮周全。
(6)除錯原則
軟體隨想錄
最近閱讀了由阮一峰翻譯的,有程式設計師部落酋長之稱的 joel 撰寫的 軟體隨想錄 精華摘抄如下 就如同所有行業最好的人才一樣,那些優秀的程式設計師是不會出現在招聘市場的。通常優秀的程式設計師在整個職業生涯中,可能會有4次求職。實習生制度創造了輸送優秀人才的管道,但是這個管道比較長,而且一路上損耗很...
軟體隨想錄
在圖書館閒逛,翻到這邊書,書如其名,像本雜記。書翻譯得極好,每個不明晰的名詞作者都給做了標記,使得外行的人,也能看的明白。1.畢業前練好寫作,但凡出眾的程式設計師,大多能夠清晰地表達自己的思想。2.畢業前學好一門偏底層語言,如c c 3.畢業前看一看微觀經濟學,至少認識市場對軟體的需求。4.不要因為...
《軟體隨想錄》筆記
l 三種管理方法 一 軍事管理法 這種方法有三個缺點 a 人們並不喜歡被這樣管。b 沒有足夠的時間用於在微觀管理上。c 在高科技公司中,負責幹活的個人總是比 領導者 有更多的資訊,所以他們其實是做決策的最佳人選。二 經濟利益驅動法 這種方法假設每個人的行為動機都是金錢,讓人們聽命於你的最好方法就是給...