調(diào)試九法總結(jié)

調(diào)試九法總結(jié)

最近兩周,閱讀完了《調(diào)試九法》,又認真的思考"調(diào)試"究竟是什么東西?
對于一個程序員來講,調(diào)試就是Debug,消除代碼中的Bug。對于硬件工程師來講,調(diào)試就是找出硬件出錯的原因。
然而抽象來講,調(diào)試其實就是找出問題的原因,并研究如何去解決一個問題。
《調(diào)試九法》使用了作者本人經(jīng)歷過的多種案例,向我們一一說明,如何去解決一個問題。

規(guī)則闡述

既然是《調(diào)試九法》,當(dāng)然是介紹九種方法去解決一個問題。
書中提到了九個規(guī)則,依照作者的說明,按照這些規(guī)則去解決問題,往往能很快就得到解決方法。

  • 規(guī)則一 理解系統(tǒng)
  • 規(guī)則二 制造失敗
  • 規(guī)則三 不要想 而要看
  • 規(guī)則四 分而治之
  • 規(guī)則五 一次只改一個地方
  • 規(guī)則六 保持審計跟蹤
  • 規(guī)則七 檢查插頭
  • 規(guī)則八 獲得全新觀點
  • 規(guī)則九 如果你不修復(fù)bug,它將依然存在

規(guī)則一 理解系統(tǒng)

這個規(guī)則很容易理解,理解系統(tǒng)的意思就是說,當(dāng)我們遇到問題時,首先先判斷自己使用一個工具的方式是不是正確,是不是符合預(yù)期。
在一些簡單的開發(fā)過程中,容易出現(xiàn)這樣的問題————一個很簡單的代碼,然而最后的結(jié)果不符合預(yù)期,最后卻發(fā)現(xiàn)只是因為函數(shù)的調(diào)用方式不正確,或者參數(shù)類型不對。
在遇到問題的時候首先應(yīng)該想到是我的使用方式是不是有問題,然后去閱讀一下相關(guān)的說明文檔,也許就能找到答案。

規(guī)則二 制造失敗

判斷Bug一般會有一個指標(biāo)叫復(fù)現(xiàn)率,如果一個Bug的復(fù)現(xiàn)幾率是100%,那么這個Bug就很容易被定位,進而很容易觀察以及調(diào)試。
然而如果一個Bug很難復(fù)現(xiàn),或者是周期性的,那么就要想辦法讓他更容易復(fù)現(xiàn)。

同時作者還提到一點,不要模擬失敗。有可能一個模擬的環(huán)境并不能等價于Bug出現(xiàn)的環(huán)境,這樣就很難定位到Bug,要通過其他工具在現(xiàn)場觀察Bug。

規(guī)則三 不要想 而要看

這條規(guī)則比較簡單,我們在進行調(diào)試的時候,多進行觀察,而不是想當(dāng)然的去猜。當(dāng)使用了規(guī)則二復(fù)現(xiàn)了Bug之后,就可以利用手頭的工具去認真觀察這個Bug。比如打印Log或者使用GDB。
單純一味的去猜想問題的原因并進行修改,很有可能精疲力盡但仍然沒有任何的頭緒。
這一條中提到了插裝的思路,即使用各種外部組件,在不影響程序內(nèi)部運行的情況下,查看程序內(nèi)部的運行狀況。

規(guī)則四 分而治之

這條規(guī)則有點像二分查找算法。
如果一個問題的可疑區(qū)域很廣泛,那么就很難被調(diào)試,通過使用其他的方法去逐步縮小問題的可疑區(qū)間,會節(jié)省很多時間。
如果一個問題有很多個分支,就從分支的根節(jié)點開始逐一確認問題的路線,逐步定位到這個"樹"的葉子節(jié)點。

規(guī)則五 一次只改一個地方

這條規(guī)則有點像做對照實驗的一條原則,對照條件要只有一條,否則無法確定是哪個條件改變導(dǎo)致實驗結(jié)果不同的。
我們在調(diào)試時要遵照這個規(guī)則,即如果懷疑兩段代碼都有問題,則不要同時修改兩個地方,而是逐一去修改,逐一去判斷這段代碼對于最終結(jié)果的影響。這次的修改一定要對正常的結(jié)果去做對比。

規(guī)則六 保持審計跟蹤

在進行調(diào)試時,如果一個操作比較復(fù)雜,則一定要通過某種措施去記錄這次修改的結(jié)果,很有可能當(dāng)經(jīng)歷了復(fù)雜的修改之后,就會忘記自己的操作。在這里代碼版本控制工具能為我們提供一個方便的功能,當(dāng)有新的功能上線之后,如果出現(xiàn)問題,就很容易能回滾到上一個版本,并檢查新提交的代碼有沒有問題。

這里作者提到過另一個問題,也就是如果讓一個不熟悉系統(tǒng)的人去使用一個工具,那么當(dāng)他遇到問題的時候,盡可能的使用詳細的語言去描述如何使用這個工具。然后作為系統(tǒng)的開發(fā)者,就更容易方便的去定位問題的原因。

規(guī)則七 檢查插頭

在添加了一個組件之后,一定要在引入的代碼塊添加捕捉異常的邏輯。
對于一個復(fù)雜組件而言,是一個黑箱,無法研究具體的內(nèi)部邏輯,因此很容易出現(xiàn)意料之外的輸出,這個時候最簡單的方法就是針對這個組件做一個封裝,考慮到所有的異常輸出,并進行處理。

規(guī)則八 獲得全新觀點

這一點其實是勸解我們要多虛心的向他人求助,很多問題在別人的經(jīng)歷來看,或許是他嘗試了無數(shù)次之后才得到一個好的解決方案。當(dāng)問題較為復(fù)雜的時候,一個人硬著頭皮去干有可能會浪費太多的精力。站在巨人的肩膀上才能看的更高。

在求助他人的時候,一定要客觀的陳述事實,不要想當(dāng)然的帶入自己的理念,否則可能會帶偏別人。比如看病,細說自己的癥狀,而不是說:我可能感冒了。

如果你不修復(fù)bug,它將依然存在

這最后一條其實是勸解我們要盡可能的去處理Bug。
首先確認Bug是不是真的解決了:

  • 添加解決方法 -> Bug消失
  • 移除解決方法 -> Bug復(fù)現(xiàn)
  • 再次添加解決方案 -> Bug消失

可能有許多的Bug很容易隨著時間的流逝不再出現(xiàn),然而作為Bug的制造者而言,這個思維,這個想法會一直保留在大腦里,一旦下一次遇到這個問題,就有可能在另外一個系統(tǒng)里復(fù)現(xiàn),因此重要的是糾正自己的錯誤的想法,找到解決問題的辦法。

整體總結(jié)

《調(diào)試九法》的確是一本好書,講述的思維從抽象的角度可以延伸到任何一個問題的解決思路,我還需要認真領(lǐng)悟,并嘗試使用這九個原則去解決任何一個問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,901評論 25 709
  • 轉(zhuǎn)自:http://openresty.org/posts/dynamic-tracing/ 關(guān)于作者 大家好,我...
    鯨息_Leon閱讀 1,301評論 0 2
  • 兒子問我 為什么每次放學(xué)出來 你總是先看到我 我長得又不出眾 也沒什么特色 在人海中屬于不起眼的小角色 我笑了 其...
    一度一閱讀 270評論 0 0
  • 記錄近期繪畫練習(xí),時間不足,都沒有做深入刻畫。
    小魚素素閱讀 200評論 0 2

友情鏈接更多精彩內(nèi)容