常用 BUG 解决方法
扯淡
??隨著工作時(shí)間越來越長,對(duì)于代碼的理解也越來越多!關(guān)注重點(diǎn)也漸漸地從代碼本身轉(zhuǎn)移到了代碼結(jié)構(gòu)性、解決問題方法性等方面。下面就來說一說,在遇到代碼BUG,我們常用的一些方法!
二分定位法
??通常來說,無論BUG因此多深,通過二分定位法基本可以確定問題所在!那么什么是二分定位法?就是在程序關(guān)鍵點(diǎn)(可能的出錯(cuò)點(diǎn))進(jìn)行分割,看看還會(huì)不會(huì)出問題,類似二分查找的方法,逐步縮小問題范圍。
??二分定位法適用于絕大所數(shù)問題環(huán)境。對(duì)二分定位法作進(jìn)一步擴(kuò)展延伸,就會(huì)得出我們常用一些BUG解決方法:
- 注釋大法: 將代碼一點(diǎn)點(diǎn)注釋,來縮小范圍
- Printf大法: 在合適的代碼位置對(duì)特定的變量等進(jìn)行輸出
- 日志大法: 在代碼合適位置記錄相關(guān)變量等關(guān)鍵數(shù)據(jù)
或許你還有其他名稱的方法,但是基本都屬于二分定位法的范疇!
IDE調(diào)試法
??此法在程序開發(fā)階段是絕對(duì)的利器!通過加斷點(diǎn)、單步調(diào)試等可以快速的發(fā)現(xiàn)問題所在。突然想到了宇宙第一 IDE:Visual Studio。但是,該方法有個(gè)比較大的限制:對(duì)于非邏輯性錯(cuò)誤(比如內(nèi)存泄露)來說,IDE調(diào)試法就有些乏力了。因?yàn)閱渭兊恼{(diào)試,可能BUG并不會(huì)出現(xiàn)。而且一旦出現(xiàn)該種問題,可能會(huì)直接導(dǎo)致 IDE 調(diào)試不可用。
??其實(shí),IDE 調(diào)試,不僅僅是找 BUG 解決問題,對(duì)于分析代碼邏輯來說無二選擇。對(duì)于某些設(shè)計(jì)邏輯的實(shí)現(xiàn),是否符合當(dāng)初的設(shè)計(jì)。僅僅通過最終結(jié)果不能證明正確,還是需要通過IDE來驗(yàn)證!殊不知,在破解、逆向領(lǐng)域,調(diào)試絕對(duì)的 NB,誰會(huì)有心情悶頭看那一堆匯編代碼,直接上調(diào)試器分析多好。
小黃鴨調(diào)試法(Rubber duck debugging)
??又稱橡皮鴨調(diào)試法,黃鴨除蟲法。就是通過向不懂程序的人(只要是不了解要解釋的代碼的任何一個(gè)人都可以,比將你寫的代碼解釋給你的同事)詳細(xì)解釋代碼,從中發(fā)現(xiàn)問題或者獲取靈感! 此概念是參照于一個(gè)來自《程序員修煉之道》書中的一個(gè)故事。傳說中程序大師隨身攜帶一只小黃鴨,在調(diào)試代碼的時(shí)候會(huì)在桌上放上這只小黃鴨,然后詳細(xì)地向鴨子解釋每行代碼。
??許多程序員都有過向別人(甚至可能向完全不會(huì)編程的人)提問及解釋編程問題,就在解釋的過程中擊中了問題的解決方案。一邊闡述代碼的意圖一邊觀察它實(shí)際上的意圖并做調(diào)試,這兩者之間的任何不協(xié)調(diào)會(huì)變得很明顯,并且更容易發(fā)現(xiàn)自己的錯(cuò)誤。如果沒有玩具小鴨子也可以考慮向其它東西傾訴,比如桌上的花花草草,鍵盤鼠標(biāo)。
??類似的,有一種現(xiàn)象叫做ConeofAnswers,這是一個(gè)常見的現(xiàn)象。你的朋友跑來問你一個(gè)問題,但是當(dāng)他自己把問題說完,或者說到一半的時(shí)候就想出了答案走了,留下一臉茫然的你。是的,這個(gè)時(shí)候你就起到了那只小黃鴨的作用。
??相似的概念還有不少,列如自白調(diào)試、紙板程序員或程序員的假人、想出腦外等等。總的來說,在你試圖表述自己的想法的過程中,自然地在促使自己去整理思路,重新考慮問題。
??這種方法流傳開后,很多程序員效仿,開始拿其他玩具,比如手辦、喜歡二次元的、還會(huì)拿初音或者是其他公仔呀。
重讀法
??這種方法比較簡單直接,就是通過一遍遍地閱讀代碼來發(fā)現(xiàn)問題。
重構(gòu)法
??終極必殺器。如果最終無論如何也不能找到BUG的問題所在,那就直接重構(gòu)吧!重構(gòu)有個(gè)問題需要注意,就是重構(gòu)時(shí)不要再參看之前的代碼!重構(gòu)必須要考慮結(jié)構(gòu)性的設(shè)計(jì)問題!
??當(dāng)然,對(duì)于簡單的代碼(對(duì)整體代碼結(jié)構(gòu)影響不大),直接重寫會(huì)更迅速!
總結(jié)
??常用的BUG查找方法基本就是以上這幾種,可能你還有不同的叫法或者其他方法。在實(shí)際問題解決中,可能需要多種方法結(jié)合使用。
??優(yōu)先解決可重現(xiàn)的bug,有些bug不是很明顯,那么就想辦法增加他的破壞性,把現(xiàn)象放大,這在我們的系統(tǒng)壓力測(cè)試時(shí)會(huì)經(jīng)常遇到一種方法。有時(shí)候我們甚至需要問自己,如果我要實(shí)現(xiàn)bug描述的現(xiàn)象我要怎么寫代碼才行?
最后放幾個(gè)奇葩注釋!
總結(jié)
以上是生活随笔為你收集整理的常用 BUG 解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SourceInsight 4.0 之二
- 下一篇: LwIP 之六 详解动态内存管理 内存池