《除錯九法 軟硬體錯誤的排查之道》簡要

2021-10-24 18:54:47 字數 4245 閱讀 8047

本書的主旨不在預防、保證或篩選,將教給你如何準備查詢bug,如何挖掘並仔細審查各種線索,以便找到根源,追蹤實際問題,並修復它,然後確認你已經修復問題。

雖然本書介紹的方法和系統都是通用的,但它們都緊緊圍繞乙個重點,那就是查詢bug

的根源並修復。

規則l    理解系統

規則2   製造失敗

規則3   不要想,而要看

規則4   分而治之

規則5   一次只改乙個地方

規則6   保持審計跟蹤

規則7   檢查插頭

規則8   獲得全新觀點

規則9   如果你不修復bug,它將依然存在

必須掌握系統的工作原理以及它是如何設計的。理解系統並不等於理解問題。你現在還不理解問題,但如果你想要查明系統為什麼不工作的話,必須先理解它的工作原理。

墨菲定律,事情如果有變壞的可能,不管這種可能性有多小,它總會發生。

3.1閱讀手冊

理解系統的基本方法就是閱讀手冊

如果你是一位工程師,正在除錯自己公司的產品,那麼你需要讀一讀內部手冊。工程師們設計它是用來做什麼的?讀一下功能說明以及所有的設計規範,研究一下圖表、時序圖和狀態機。分析它們的**,還要讀一下注釋(讀一下注釋,這非常重要)。一定要檢查產品的設計。查明構建它的工程師們打算用它來做什麼。

手冊上的資訊也不可全信

理解了你自己的系統後,當你找到bug時,必須在不破壞其它地方的前提下修復它們。理解系統行為是不破壞系統的第一步。

3.2逐字逐句閱讀整個手冊

應用說明和實現指南提供了豐富的資訊,不僅描述了系統是如何工作的,而且專門給出了先前已發生過的問題。常見錯誤的警告具有難以置信的價值(即使你犯的錯誤都很不常見)。從**商的站點獲取最新的文件,並閱讀**上所列出的最近一星期發現的常見錯誤。

參考設計和樣本程式,有時這些就是能獲得的全部文件了。一定要注意,建立它們的人往往只了解他們的產品,而沒有遵循好的設計實踐,或者不是為真實應用而設計的(最常見的缺點是不能進行錯誤恢復)。不要照搬這些設計,如果你沒有在開始的時候發現bug,那麼將來也會發現。此外,即使是最好的參考設計可能也不會完全符合應用程式的特定需求,而不符合的地方可能就是出問題的地方。

3.3知道什麼是正常的

你必須掌握一些你所工作的技術領域的基礎知識。

3.4知道工作流程

當你嘗試尋找bug時,必須知道要查詢的路線。開始時,你需要猜測在**把系統分隔開,以便隔離問題,這種猜測完全取決於你對系統功能劃分的了解。

3.5了解你的工具

很多任務具提供了非常強大的功能,但只有精通它們的使用者才了解。你越是精通工具,就越容易查明系統中發生了什麼事情。要花時間學習與工具有關的一切,通常,查明系統行為的關鍵(參見規則3)是你的偵錯程式設定得怎樣,或者是否正確地觸發了分析器。必須了解工具的侷限性。

3.6查閱手冊

不要猜測,而要查閱手冊。

雖然看起來很簡單,但如果不製造失敗的話,除錯就會變得很困難。

製造失敗。目的是為了觀察它,找到原因,並檢查是否已修復。

從頭開始。修車工需要知道汽車車窗在被凍結之前你洗過車。引發失敗。用噴水管向漏雨的那扇窗子噴水。

但不要模擬失敗。用噴水管向漏雨的那扇窗子噴水,而不要向另一扇不同的、「類似的」窗子噴水。

查詢不受你控制的條件(正是它導致了間歇性失敗)。改變能夠改變的每件事情,振動、搖晃、扭曲,直到再現失敗。

記錄每件事情,並找到間歇性bug的特徵。我們的繫結系統總是只在呼叫順序錯亂時才會失敗。

不要過於相信統計資料。繫結問題看起來與時間段有關,但實際上真正的原因是當地的年輕人占用了**線路。

要認識到「那」是可能會發生的。甚至冰淇淋的口味也會影響汽車的發動。

永遠不要丟掉乙個除錯工具。自動擊球板可能在某一天就會派上用場。

憑空想象,問題可能有幾千條原因。而實際的原因只有去看了才能發現。

觀察失敗。高階工程師看到了真實的問題,並且能夠找到原因。而初級工程師們認為他們知道錯誤發生在**,結果他們修復的地方根本沒有出錯。

檢視細節。聽到水幫浦似乎發出聲音時不要停下來。到地下室查明是哪個水幫浦。

植入插裝工具。使用源**偵錯程式、除錯日誌、狀態訊息、訊號燈和臭雞蛋的氣味。

新增外部插裝工具。使用分析器、示波器、量表、金屬檢測儀、心電圖儀和肥皂泡。

不要害怕深入研究。雖然它是軟體成品,但它出問題了,你必須開啟並修復它。

注意海森堡效應。不要讓儀器影響了系統。

猜測只是為了確定搜尋的重點。大膽地猜測記憶體時序發生了錯誤,但在修復之前應該先檢視它。

當bug的藏身之地不斷被縮小一半時,它將很難再隱藏下去。

通過逐次逼近縮小搜尋範圍。猜測1~100內的乙個數字,只需7次。

確定範圍。如果數字是135而你卻認為它在1~100內,那麼你必須擴大範圍。

確定你位於bug的哪一側。如果你所在的位置有排放物,則排放管就在上游。如果沒有排放物,則排放管就在下游。

使用易於檢視的測試模式。從乾淨、清澈的水開始,以便當排放物進人河流中時很容易看到它。

從有問題的一端開始搜尋。如果你驗證的是正確的部分,那麼需要驗證的地方太多了。應該從有問題的地方開始,然後向後追查原因。

修復已知bug。bug互相保護,互相隱藏。因此一旦找到,立即修復它們。

首先消除雜訊干擾。注意那些導致系統問題的干擾因素。但對一些無足輕重的問題不要過於極端,也不要為了追求完美而去修改所有地方。

我們在生活中要有一點先見之明。如果你所做的更改沒有起到預期的作用,那麼就把它改回來。它們可能會產生無法預料的影響。

隔離關鍵因素。如果你在檢查日照時間的影響,就不要改變灌溉方案。

用雙手抓住黃銅杆。如果你在不知道具體發生了什麼問題的情況下就試圖去修理核潛艇,可能會引發一次水下的車諾比**°。

一次只改乙個測試。我之所以知道我的vga採集相位被破壞了,就是因為其他東西都沒有發生改變。

與正常情況進行比較。如果所有出錯的情況都有一些特徵,而這些特徵是正常情況所沒有的,那麼你就找到了問題所在。

確定自從上一次正常工作以來你改變了什麼地方。我的工友改變了唱機轉盤上的唱頭,因此這是乙個很好的除錯起點。

一些顯而易見的假設往往是錯誤的。請恕我贅述,假設錯誤通常是最容易修復的錯誤。

置疑你的假設。是否執行了正確的**?是不是燃氣用完了?插頭是否已插好?從頭開始。是否正確地對記憶體進行了初始化?是否按了除草機上的「primer bulb」按

鈕?開關是否已開啟?

對工具進行測試。是否執行了正確的編譯器?燃料油表是否被粘住了?量表是不是沒電了?

查證問題確實已被修復。不要假設是電路的問題,而仍然讓汽車帶著髒的濾油嘴上路。

查證確實是你的修復措施解決了問題。口中大喊「wubba!」並不是使計算機開啟的竅門。

要知道,bug從來不會自己消失。使用最初導致它失敗的方法再次製造失敗。如果必須交付產品,那麼就在產品中設計乙個用於捕捉bug的「陷阱」,以便產品在客戶現場發生失敗時,把它捉住。

從根本上解決問題。在燒壞另一台變壓器之前,先把無用的8音軌磁帶卡座扔掉。

對過程進行修復。不要只是擦掉地上的油,而要糾正設計機器的方式。

除錯九法 軟硬體錯誤的排查之道

理解系統 這是第一條股則,因為它是最重要的。製造失敗 雖然看起來很簡單,但如果不製造失敗的話,除錯就會變得很困難。不要想,而要看 憑空想象,問題可能有幾千條原因。而實際原因只有去看了才能發現。分而治之 當bug的藏身之地不斷被縮小一半時,它將很難再隱藏下去。一次只改乙個地方 我們在生活中要有一點先見...

書籍推薦《除錯九法 軟硬體錯誤的排查之道》

本文閱讀時間3分鐘 每個開發者都必須都的一項技術,debug,最近讀了一本關於除錯的書分享給大家,書的內容不到200頁,一口氣讀下來,估計需要乙個小時,速度內容簡單明瞭,主要是作者20多年的工作中除錯經驗的總結,作者作為一名軟體開發人員的工作除錯經驗,同樣適用其他領域開發人員,同時,解決問題的思路也...

除錯九法 軟硬體錯誤的排查之道 讀後總結

扯了那麼多沒用的,該切到主題了,那就是對這本的讀後總結了。一本書,做做讀書總結,會讓你記憶更深刻。本人是一名軟體 cheng 工 xu 程 yuan 師,所以總結的視角主要是軟體相關的角度。這本書主要內容是對找出軟硬體中bug方法的總結,作者分了九條,分別是 1.理解系統 2.製造失敗 3.不要想,...