×少量的預防措施要比大量的治療措施有價值的多。。。
1.故障從哪里來
為了尋找有缺陷的代碼,你必須以這個故障作為起點回溯追蹤起因。
1.2從缺陷到故障
通常缺陷是通過以下四個階段產(chǎn)生的:
1.程序員制造了一個缺陷:所有代碼都是程序員寫的,寫錯了。
2.缺陷造成了錯誤狀態(tài)的感染:正確的代碼段,被錯誤的代碼感染。這時候代碼已經(jīng)不可控。
3.錯誤狀態(tài)不斷的傳播:大多數(shù)程序由于不正確的輸入而返回錯誤,當后面的程序訪問該狀態(tài)時,會把錯誤擴散到后續(xù)的程序狀態(tài)中。(正確情況應該是不會持續(xù)傳播的,應該會被后續(xù)某個模塊覆蓋或者修正)
4.錯誤狀態(tài)引發(fā)的故障:外部程序應為感知到了程序的錯誤狀態(tài)而故障
×錯誤只能程序有缺陷,不能證明程序沒有缺陷。。。
1.3迷失在時空之中
調(diào)試過程可以分解成七個步驟:
1.track the problem
2.reproduce the failure
3.automate and simplify
4.find infection origins
5.focus on likely origins
6.isolate the infection chain
7.correct the defect
在很大程度上,調(diào)試就是一個搜索問題,主要是如下兩個原則:
×從錯誤狀態(tài)中分離出正確狀態(tài):如果一個狀態(tài)是錯誤的,它可能就是從缺陷到故障的傳播鏈中的一部分;如果一個狀態(tài)是正確的,他就基本不可能有錯誤被傳播。
×從不相關(guān)狀態(tài)中分離出相關(guān)狀態(tài):一個變量的值取決于一小部分早期變量的值。因此,只有一部分早期狀態(tài)是和程序故障相關(guān)的。
1.4從故障到修正
×跟蹤問題:
×重現(xiàn)故障:
×自動化和簡化測試用例:如果是一個復雜的程序,就必須考慮如何自動產(chǎn)生故障(應為希望被重現(xiàn)),以及如何簡化輸入,得到最小測試用例。
×尋找可能的感染源:如果有自動化測試可以使用排除法,將測試數(shù)據(jù)中會導致錯誤的數(shù)據(jù)找到。
×分離感染源:假設找到是某個測試數(shù)據(jù)導致錯誤,現(xiàn)在可以回溯相關(guān)系統(tǒng)這個數(shù)據(jù)出來的模塊。
×修正缺陷:
1.5自動調(diào)試技術(shù)
×簡化輸入:
×程序片段:
×觀察狀態(tài):
×監(jiān)視狀態(tài):
×斷言:
×反常:
×因果鏈:
1.6 BUG、失誤、還是缺陷
缺陷(defect):錯誤的程序代碼(代碼中的bug)
錯誤的狀態(tài)感染(infection): 錯誤的程序狀態(tài)(狀態(tài)中的bug)
故障(failure): 可感知程序的錯誤行為(行為中的bug)
summary:
1.調(diào)試程序的七個步驟:跟蹤->重現(xiàn)->自動化->發(fā)現(xiàn)感染源->重點關(guān)注->分離->修正
咱們平常就是自動化和分離的時候會偷懶,老實說,在調(diào)試復雜程序的時候,花點時間做自動化和分離是“磨刀不誤砍柴功”
////////////////////////////////////////////////////////////////////////////////////////////////
程序員寫了一段有缺陷的代碼,這是否意味著他犯了過錯呢?考慮這些情況:
原始需求沒有預測到未來的變化,如:千年蟲
只有當程序的某種行為呈現(xiàn)在用戶面前是時,才有可能被列入“故障”
在模塊化的程序中,故障可能是由兩個模塊之間的不兼容接口造成的。
分布式系統(tǒng)中,故障可能是由幾個組件之間無法預測的交互造成的
。。。。。。
這時候討論責任已然是一種政治態(tài)度
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
///// f16的bug

////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////