標籤:style http ar 使用 sp strong 資料 on 問題
調試九法概要思維導圖
文字概要
理解系統
這是第一條股則,因為它是最重要的。
閱讀手冊。它會告訴你在使用除草機時,要在除草頭上塗潤滑油,這樣除草繩就不會被燒化。
仔細閱讀每一個細節。關於微處理器如何處理中斷的詳細資料就隱藏在資料手冊的第37頁。
掌握基礎知識。點據本身就會發出很大的雜訊。
瞭解工作流程。引擎的轉速可能與輪胎的轉速不同,這是由傳動軸造成的。
瞭解工具。弄清楚體溫計的哪一端才是用來測量體溫的,弄清楚Glitch-O-Matic邏輯分析器的強大功能是如何使用的。
查閱細節。連愛因斯坦都會查閱細節,而Kneejerk卻盲目相信自己的記憶力。
製造失敗
雖然看起來很簡單,但如果不製造失敗的話,調試就會變得很困難。
製造失敗。目的是為了觀察它,找到原因,並檢查是否已修複。
從頭開始。修車工需要知道汽車車窗在被凍結之前你洗過車。
引發失敗。用噴水管向漏雨的那扇窗子噴水。
但不要類比失敗。用噴水管向漏雨的那扇窗子噴水,而不要向另一扇不同的、“類似的”窗子噴水。
尋找不受你控制的條件(正是它導致了間歇性失敗)。改變能夠改變的每件事情,震動、搖晃、扭曲,直到再現失敗。
記錄每一件事情,並找到間歇性bug的特徵。我們的繫結系統總是只在呼叫順序錯亂時才會失敗。
不要過於相信統計資料。綁定問題看起來與時間段有關,但實際上真正的原因是當地的年輕人佔用了電話線路。
要認識到“那”是可能發生的。甚至冰淇淋的口味也會影響汽車的發動。
永遠不要丟掉一個調試工具。自動擊球板可能在某一天就會派上用場。
不要想,而要看
憑空想象,問題可能有幾千條原因。而實際原因只有去看了才能發現。
觀察失敗。進階工程師看到了真實的問題,並且能夠找到原因。而初級工程師認為他們知道錯誤發生在哪裡,結果他們修複的地方根本沒有出錯。
查看細節。聽到水泵似乎發出聲音時不要停下來。到地下室查明是哪個水泵。
植入插裝工具。使用原始碼調試器、調試日誌、狀態訊息、號誌和臭雞蛋的氣味。
添加外部插裝工具。流量分析器、示波器、量表、金屬檢測儀、心電圖和肥皂泡。
不要害怕深入研究。雖然它是軟體成品,但它出問題了,你必須開啟並修複它。
注意海森堡效應。不要讓儀器影響了系統。
猜測只是為了確定搜尋的重點。大膽地猜測記憶體時序發生了錯誤,但在修複之前應該先查看它。
分而治之
當bug的藏身之地不斷被縮小一半時,它將很難再隱藏下去。
通過逐次逼近縮小搜尋範圍。猜測1~100內的一個數字,只需7次。
確定範圍。如果數字是125而你卻認為它在1~100內,那麼你必須擴大範圍。
確定你位於bug的哪一側。如果你所在的位置有排放物,則排放管就在上遊。如果沒有排放物,則排放管就在下遊。
使用易於查看的測試模式。從乾淨、清澈的水開始,以便當排放物進入河流中時很容易看到它。
從有問題的一端開始搜尋。如果你驗證的是正確的部分,那麼需要驗證的地方太多了。應該從有問題的地方開始,然後向後追查原因。
修複已知bug。bug互相保護,互相隱藏。因此一旦找到,立即修複它們。
首先消除雜訊幹擾。注意哪些導致系統問題的幹擾因素。但對一些無足輕重的問題不要過於極端,也不要為了追求完美而去修複所有地方。
一次只改一個地方
我們在生活中要有一點先見之明。如果你所做的更改沒有起到預期的作用,那麼就把它改回來。它們可能會產生無法預期的影響。
隔離關鍵因素。如果你在檢查日照時間的影響,就不要改變灌溉方案。
用雙手抓住黃銅杆。如果你在不知道具體發生了什麼問題的情況下就試圖去修理核潛水艇,可能會引發一次水下的切爾諾貝利爆炸。
一次只改一個測試。我之所以知道我的VGA採集相位被破壞了沒就是因為其他東西都沒有發生改變。
與正常情況進行比較。如果所有出錯的情況都有一些特徵,而這些特徵是正常情況所沒有的,那麼你就找到了問題所在。
確定自從上一次正常工作以來你改變了什麼地方。我的工友改變了唱機轉盤上的唱頭,因此這是一個很好的調試起點。
保持審計跟蹤
不要只是在心裡記住“保持審計跟蹤”這條規則,而要把它寫下來。
把你的操作、操作的順序和結果全部記錄下來。你上一次喝咖啡是什麼時候?你的頭痛是從什麼時候開始的?
要知道,任何細節都可能是重要的。視頻壓縮晶片的崩潰是由于格子襯衫造成的。
把事件關聯到一起。“它發出雜訊。從21:03:53開始,持續4秒”比僅僅說“它發出雜訊”要好得多。
用於設計的審計跟蹤在測試中也非常有用。軟體配置控制工具可以告訴你哪次修訂引入了bug。
把事情記錄下來!無論那個時刻多麼恐怖,都要把它記到備忘錄中,這樣你才不會忘記。
檢查插頭
一些顯而易見的假設往往是錯誤的。請恕我贅述,假設錯誤通常是最容易修複的錯誤。
質疑你的假設。是否運行了正確的代碼?是不是燃氣用完了?插頭是否已插好。
從頭開始。是否正確地對記憶體進行了初始化?是否按了除草機上的“primer bulb”按鈕?開關是否已開啟?
對工具進行測試。是否運行了正確的編譯器?燃料油表是否被粘住了?量表是不是沒電了?
獲得全新的觀點
不管怎樣,你都需要休息一下,喝杯咖啡。
徵求別人的意見。甚至一個不說話的人體模特也能協助你認識到你先前沒有注意到的事情。
擷取專業知識。只有VGA視頻採集卡的廠商才能夠肯定相位功能發生錯誤。
聽取別人的經驗。別人會告訴你車內頂燈的線被擠壓出來了。
協助無處不在。同事、供應商、網路,還有書店,都在等待著為你提供協助。
放下面子。bug發生了。以除掉bug為自豪,而不要非得以自己除掉bug才為自豪。
報告癥狀,而不要講你的理論。不要把別人拖進你的思維定式中。
你提出的問題不必十分肯定。甚至連“穿了格子襯衫”這樣的事情也可以提出來。
如果你不修複bug,它依然存在
現在你已經掌握了所有的技術,沒有理由再讓bug存在了。
查證問題確實已被修複。不要假設是電路的問題,而仍然讓汽車帶著髒的濾油嘴上路。
查證確實是你的修複措施解決了問題。口中大喊“Wubba!”並不是使電腦開啟的訣竅。
要知道,bug從來不會自己消失。使用最初導致它失敗的方法再次製造失敗。如果必須交付產品,那麼就在產品中設計一個用於捕捉bug的“陷阱”。以便產品在客戶現場發生失敗時,把它捉住。
從根本上解決問題。在燒壞另一台變壓器之前,先把無用的8音軌磁帶卡座扔掉。
對過程進行修複。不要只是擦掉地上的油,而要糾正設計機器的方式。
先是把書寫厚,然後把書寫薄,這是一本很好懂的書,裡面主題清晰明了。但這本書的內容絕不簡單,調試是個大學問。平時的工作中,我的調試方法在書中經常出現,但那是毫無章法的,隨機去調試,看當時的狀況。作者把它歸納為科學的方法,只要一步一步來就能找到問題所在,這正是作者的偉大之處,在混沌中發現規律。
再者,書本身結構很好,每章都有自己的總結,結構十分情緒,不需要讀者自己理清線索,呈現更重要的部分。
這個一本相當不錯的書,建議大家有時間都去看看,其中的方法是普適的,可以應用在不同的情境。
說一些題外話,我是最近才克服拖延症,開通部落格,寫部落格,所以各個方面還都比較青澀,在思維導圖的應用,部落格的寫法等,希望大家多多指導,有建議可以多多提,這也是我希望的,從一個點帶動一個面,面會反作用一個點,開創一個雙贏的局面,大家共同提高。我爭取每個星期都能寫點的東西,先是分享一些學來的東西,再到原創。平時讀書的時間也不多,再總結分析,還是要滯後1到2個星期的。今天畫思維導圖,用了ubuntu下的多個案頭,發現這個切換起來還真方便,再加上xmind,用起來不錯。
《調試九法:軟硬體錯誤的排查之道》