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