以我的觀(guān)點(diǎn)來(lái)看:做出一個(gè)業(yè)務(wù)功能是件很簡(jiǎn)單的事,做好則有難度,高效的做好則是難上加難。拋開(kāi)前期的架構設計、技術(shù)方案的制定不談,單單是寫(xiě)好代碼這一階段就給我們每個(gè)人帶來(lái)了不同程度的挑戰。之前還寫(xiě)過(guò)一篇關(guān)于代碼編寫(xiě)階段的文章《提高工作效率的工具“類(lèi)”》,下面我就主要從代碼debug的角度來(lái)談?wù)勎业目捶ā?/p>
盡量寫(xiě)代碼時(shí)避免bug,減少調試
對于任何問(wèn)題,先以預防為主。在團隊中常??梢杂鲆?jiàn)這樣的同事,代碼寫(xiě)的非???,可是天馬行空的代碼之后卻讓自己陷入了無(wú)盡debug的沼澤。我會(huì )給這樣的同事建議:多花點(diǎn)時(shí)間做好代碼結構的設計,寫(xiě)代碼時(shí)經(jīng)常進(jìn)行review,另外就是老生常談的細心。
利用好IDE和工具
常常聽(tīng)到這樣的看法,用vim,emacs的看不起用IDE的,覺(jué)得vim..就是銀彈,不管什么語(yǔ)言,什么平臺只要你問(wèn)他什么IDE最好,他一定回答你vim..。當然不排除有能把vim..用的出神入化的人,其他的大多數是在裝X吧。你要記住,你的目標是完成工作,不是顯示自己多高端,多牛X。gdb同理。合適的IDE有很多好處:錯誤提示、代碼補全、豐富的替換查找、各種關(guān)聯(lián)跳轉,當然如果你不嫌麻煩,不怕不準確也可以對vim進(jìn)行配置來(lái)實(shí)現相同的效果,但請先看看這篇文章再做決定《編輯器與IDE》,以上幾個(gè)IDE帶來(lái)的好處不正好對我們上面提的“盡量避免bug”有很正面的意義嘛。另外,IDE集成的debug界面友好也強大(用過(guò)gdb的朋友肯定知道),斷點(diǎn),step over,step into,內存變量,調用堆棧...簡(jiǎn)直就是debug神器,至少我寫(xiě)程序讀程序的標準步驟就是依靠這幾步。(說(shuō)點(diǎn)夸張的,但是我還確實(shí)遇到了不少人包括一些很多年工作經(jīng)驗的工程師竟然從沒(méi)有用過(guò)斷點(diǎn)調試,完全靠著(zhù)printf行走江湖,我的“驚訝”如滔滔江水啊...),在調試中其他工具的使用也可以使debug事半功倍,比如內存泄露的檢測工具,還有進(jìn)行網(wǎng)絡(luò )編程時(shí)的各種工具(wirshark,netcat,tcpdump...)
程序輸出日志
我認為日志系統也應該是一個(gè)程序的標準組成部分。其最大用處就是幫助我們來(lái)梳理程序行為,準確定位bug。有些朋友要問(wèn)了,我可以用IDE來(lái)調試觀(guān)察啊,問(wèn)題是很多bug并不是在你寫(xiě)代碼測試時(shí)發(fā)現的,是在發(fā)布之后的用戶(hù)那里,傻眼了吧?還有很重要的一點(diǎn),多線(xiàn)程問(wèn)題、還有一些依賴(lài)于具體系統環(huán)境或時(shí)間環(huán)境的問(wèn)題是很難復現的,這次抓不住你就等著(zhù)一直提心吊膽吧。我在工作中一直使用Apache的log4X系列,又一個(gè)強大的神器。但在有些環(huán)境下用不了log4X,比如在有些對程序所占空間大小很敏感的的嵌入式環(huán)境(log4cxx的動(dòng)態(tài)庫較大),你完全可以自己利用標準輸出封裝相應的日志系統,然后運行時(shí)做好定向輸出工作就好。
崩潰轉儲
崩潰這種fatal級的大bug最讓我們頭疼,在C/C++中十有八九是內存違例(段錯誤)造成的。這種bug和多線(xiàn)程問(wèn)題一樣也是最難找的,所以我們一定要盡可能的準確定位抓住它,最有效的辦法就是利用內存轉儲文件。在linux平臺下開(kāi)啟這個(gè)選項后利用gdb core就可以進(jìn)行定位分析。windows平臺下較麻煩,得自己實(shí)現內存轉儲功能,推薦大家一個(gè)工具類(lèi)mini_dump,一旦程序崩潰就會(huì )產(chǎn)生dump文件,之后使用windbg調試即可。
google
很多bug自己想了各種辦法也定位不了或者無(wú)法fix,這時(shí)你就得請教google大神了。盡量別用百度,如果中文搜索條目很少或沒(méi)有,換成英文搜索,也許會(huì )有更多的收獲。
問(wèn)
我給我的團隊成員提了這么一個(gè)建議:如果一個(gè)問(wèn)題你自己嘗試了,也google了,但是無(wú)法解決。一旦超過(guò)一個(gè)小時(shí)耗在這個(gè)問(wèn)題上請大膽的尋求外部幫助吧,問(wèn)團隊中經(jīng)驗較豐富的成員,也許他曾經(jīng)遇到過(guò),也許他會(huì )給你提供好的建議或者思路。
深入學(xué)習
其實(shí)這點(diǎn)排在最前面比較合適,先去深入學(xué)習再去做相應的工作。但是我們實(shí)際工作中恰恰相反,往往是遇到了問(wèn)題再去深入學(xué)習,我覺(jué)得很多bug的形成是我們對知識的一知半解甚至一無(wú)所知造成的,我們要盡量拋棄那種臨時(shí)抱佛腳式的學(xué)習,而是要在自己的職業(yè)生涯中持續不斷學(xué)習,深入學(xué)習。
以上就是我對提高debug能力的一些看法和實(shí)踐。
聯(lián)系客服