尚學堂【官網】-西安Java培訓|c++培訓|Android培訓|安卓培訓|java視頻教程|軟件工程師|-西安雁塔尚學堂計算機學校
常見問題  尚學堂首頁新聞公告常見問題

程序員如何去快速定位bug

www.mdxlln.live 發布人:java  |  來自:本站  |  發布時間:2019-05-25 17:42:00  |  點擊次數:1606
 找 bug(如 Testing)與去 bug(Debugging),這在軟件工程里是兩個截然不同的任務。發現 bugs,測試并非唯一手段,其他還有 Code Review、Inspection 等等。

找 bugs 通常有幾個相對快速的辦法。


比如,為 code base 編寫/添加更多的自動單元測試,這是一種白盒測試。你 Mentor 讓你“先從找 code base 中 bug 開始”,除了讓新手閱讀、熟悉老代碼外,大概也有這層意思。

 

找到 bugs 后,怎么快速、高效地掐蟲(Debugging)就是另一碼事了。


Debug 對于新手來說普遍是一大弱項,在這上面常常要耗去大量的調試時間。什么原因?這主要是因為新手編碼、讀碼的量都很少,而且都沒經過什么系統性的訓練,邏輯推理思維很弱,最關鍵一點是 —— 你們在大腦里的思考,對于真實的軟件結構、軟件模型(尤其運行態模型)的理解是混亂的,所以往往很難像經驗豐富的老手那樣迅速、準確地定位 bug 所在。

 

0.優先解決那些可重現的

 

 優先解決那些可重現的,可重現的bug特別好找,反復調試測試就好了,先把好解決的干掉,這樣最節約時間。

 

1.抱同事的大腿 

 

對于某些bug沒有頭緒或者現象古怪不知道從哪里下手,找有經驗的同事問一下思路,因為在那種開發多年的大型系統里,經常會反復出現同樣原因的bug,原因都類似,改了一處,過一陣子另外一處又冒出來,而且無法根治。


比如:我那個系統里有個特別危險的API,接口參數比較難用,一旦有人用錯了某些情況下就會出詭異的現象,解決很簡單,找到調用這個API的地方把調用方式寫對就好了。為什么不根治呢?因為要保持兼容性不能改接口了。


問下老員工吧,說不定他們都遇到過好多次了。

 

2. 放大現象

 

有些bug現象不太明顯,那么就想辦法增大它的破壞性,把現象放大。這只是個思路,具體怎么放大只能根據具體的代碼來定。

3. 二分法定位

 

把程序邏輯一點點注釋掉,看看還會不會出問題,類似二分查找的方法,逐步縮小問題范圍。

 

4. 模擬現場

 

有時候我會問自己,如果我要實現bug描述的現象我要怎么寫代碼才行?


比如:我遇到一個死鎖問題,但是檢查代碼發現所有的鎖都是配對的,沒有忘記解鎖的地方,而且鎖很簡單就是一個普通的臨界段,保護幾行賦值語句而已。這樣的代碼怎么寫才能讓他死鎖呢?


我想如果讓我故意制造這樣一個現象,只有在上鎖的時候強制殺掉線程了。
既然這樣就可以去看看有誰強殺線程了沒有。

 

5. 制作工具

 

針對某些bug編寫一些調試輔助工具。


比如,我那個系統沒有完善的崩潰報告,雖然也有dump,但是分析出來的callstack經常不準。于是我為解決崩潰問題編寫了個工具,會自動掃描代碼,在每個函數入口和出口插入log,以此來定位崩潰點。

 

6. 掩蓋問題

 

雖然這樣做有點不厚道,但是有時不得不這么做。有些bug找不到真正的root cause,但是又要在規定時間內解決,那么我們就可以治療癥狀而不去找病因。比如用try catch掩蓋一些奇怪的崩潰。不到萬不得已不要這么干,未來可能會付出更大代價。

 

結語


debug的經驗本身就需要慢慢積累,所以新手要腳踏實地端正態度,及時發現問題并虛心接受和改進,達到目標并非遙不可及。因為寫程序可能靠天賦,debug不僅能讓你鍛煉細心和耐心,還能讓你了解開發中出現的各種問題,甚至在與開發人員的溝通中慢慢積累解決方式,這對于你以后寫代碼是非常大的幫助!

 

最后再提醒大家一句:預防,比debug更重要。

當前文:程序員如何去快速定位bug
上一頁:如何寫出更好的Java代碼
下一頁:Javac編譯器的工作過程
在線報名(*為必填項)
2019刘佰温白小姐一马一肖