企業級軟件開發服務商,專注于為企業提供高端型軟件定制開發及解決方案服務,服務電話:0539-2490808

《國家雙軟認證企業》 《 國家高新技術企業》 《山東省軟件協會理事單位》 《用友暢捷通ISV合作伙伴》

程序員新人怎樣在復雜代碼中找 bug?

臨沂精益軟件有限公司根據大型軟件開發和維護工作經驗,那個項目有 10 多年了,大約 3000 萬行以上的代碼,參與過開發的有數千人,代碼 checkout 出來有大約 5 個 GB,而且 bug 特別多,open 的有上千,即使最高優先級的 showstopper 也有上百。分享下我的 debug 的經驗 ——

1、優先解決那些可重現的,可重現的 bug 特別好找,反復調試測試就好了,先把好解決的干掉,這樣最節約時間。
2、對于某些 bug 沒有頭緒或者現象古怪不知道從哪里下手,找有經驗的同事問一下思路,因為在那種開發多年的大型系統里,經常會反復出現同樣原因的 bug,原因都類似,改了一處,過一陣子另外一處又冒出來,而且無法根治。比如:我那個系統里有個特別危險的 API,接口參數比較難用,一旦有人用錯了某些情況下就會出詭異的現象,解決很簡單,找到調用這個 API 的地方把調用方式寫對就好了。為什么不根治呢?因為要保持兼容性不能改接口了。Windows 系統里就好多這種爛 API。問下老員工吧,說不定他們都遇到過好多次了。

3、放大現象,有些 bug 現象不太明顯,那么就想辦法增大它的破壞性,把現象放大。這只是個思路,具體怎么放大只能根據具體的代碼來定。比如:美劇《豪斯醫生》里有一集,懷疑病人心肺有問題,就讓病人去跑步機上跑步,加重心肺負擔,從而放大癥狀。
4、二分法定位,把程序邏輯一點點注釋掉,看看還會不會出問題,類似二分查找的方法,逐步縮小問題范圍。

5、模擬現場,有時候我會問自己,如果我要實現 bug 描述的現象我要怎么寫代碼才行?比如:我遇到一個死鎖問題,但是檢查代碼發現所有的鎖都是配對的,沒有忘記解鎖的地方,而且鎖很簡單就是一個普通的臨界段,保護幾行賦值語句而已。這樣的代碼怎么寫才能讓他死鎖呢?我想如果讓我故意制造這樣一個現象,只有在上鎖的時候強制殺掉線程了。既然這樣就可以去看看有誰強殺線程了沒有。
6、制作工具,針對某些 bug 編寫一些調試輔助工具。比如,我那個系統沒有完善的崩潰報告,雖然也有 dump,但是分析出來的 callstack 經常不準。于是我為解決崩潰問題編寫了個工具,會自動掃描代碼,在每個函數入口和出口插入 log,以此來定位崩潰點。
7、掩蓋問題,雖然這樣做有點不厚道,但是有時不得不這么做。有些 bug 找不到真正的 root cause,但是又要在規定時間內解決,那么我們就可以治療癥狀而不去找病因。比如用 try catch 掩蓋一些奇怪的崩潰。不到萬不得已不要這么干,未來可能會付出更大代價。

關鍵字: 臨沂精益軟件有限公司 軟件開發
上期平码算特7码公式