調試嵌入式系統是嵌入式開發人員必不可少的事情。調試的范圍可以從非常簡單的錯誤(幾乎不需要任何時間來調試)到人類已知的一些最復雜和最令人沮喪的錯誤。任何嵌入式軟件錯誤都可以分為四種不同的類別,雖然其中一些類別可能看起來很奇怪,但每個類別確實是可能的。
錯誤類型 1 – Bohrbugs
如果一個嵌入式系統會有bug,開發人員更愿意把它們歸類為Bohrbugs。Bohrbugs是當軟件在類似的條件下運行時很容易重現的軟件錯誤。因為開發人員可以重現bug,所以深入研究并找到根本原因通常很簡單。
錯誤類型 2 – Heisenbugs
開發人員時不時會遇到一個bug,一旦發現這個bug,它就會消失,任何重現這個bug的嘗試都會失敗。開發人員可能會認為這是僥幸找到了系統,但實際上該系統有一個 Heisenbug。Heisenbug 是一種bug,一旦在系統中觀察到它們,就會改變它們的行為和屬性。嘗試隔離和調試問題通常是困難和短暫的。Heisenbugs 通常表明代碼中某處存在競爭條件。對代碼進行輕微的修改,調整時間或者將調試器連接到系統上,就能神奇地讓bug消失。
錯誤類型3 – Schroedinbugs
開發人員偶爾會開發一個看起來運行完美的嵌入式系統。嵌入式開發人員可能正在執行代碼審查或添加新功能,然后突然發現代碼中有一個從未在系統中出現過的bug。在檢查系統行為時,開發人員發現系統一直不能正常工作!只有當你觀察它們時才會出現的bug被稱為Schroedinbugs。在發現bug之前,系統運行良好,但是只有在發現bug之后,它才會突然表現出一致的行為。
錯誤類型4 – Mandel bugs
開發人員有時會遇到一個看似簡單、類似Bohrbug的bug。在對代碼做了微小的修改后,bug似乎被解決了,但是在修復第一個bug時又發現了一個新的bug。修復第二個bug會導致系統中出現第三個和第四個bug,然后是第五個,第六個,第七個!無論開發人員做什么,對一個bug的解決方案似乎都會破壞這個bug,導致系統中更多的bug和問題。這些看起來斷裂或混亂的bug被稱為Mandel bugs,這個想法是,這些看似簡單的錯誤實際上是系統中復雜交互的結果,開發者并沒有完全理解。因此,解決一個領域的問題會導致另一個領域的問題。
結論
人類已知的每一個軟件bug都屬于這四個bug類別之一,下次系統需要調試時,請記住這些類別,對bug進行分類可以幫助嵌入式開發人員找到潛在的原因。