常用BUG解決方法
扯淡
隨著工作時間越來越長,對於程式碼的理解也越來越多!關注重點也漸漸地從程式碼本身轉移到了程式碼結構性、解決問題方法性等方面。下面就來說一說,在遇到程式碼BUG,我們常用的一些方法!
二分定位法
通常來說,無論BUG因此多深,通過二分定位法基本可以確定問題所在!那麼什麼是二分定位法?就是在程式關鍵點(可能的出錯點)進行分割,看看還會不會出問題,類似二分查詢的方法,逐步縮小問題範圍。
二分定位法適用於絕大所數問題環境。對二分定位法作進一步擴充套件延伸,就會得出我們常用一些BUG解決方法:
- 註釋大法: 將程式碼一點點註釋,來縮小範圍
- Printf大法: 在合適的程式碼位置對特定的變數等進行輸出
- 日誌大法: 在程式碼合適位置記錄相關變數等關鍵資料
或許你還有其他名稱的方法,但是基本都屬於二分定位法的範疇!
IDE除錯法
此法在程式開發階段是絕對的利器!通過加斷點、單步除錯等可以快速的發現問題所在。突然想到了宇宙第一IDE:Visual Studio。但是,該方法有個比較大的限制:對於非邏輯性錯誤(比如記憶體洩露)來說,IDE除錯法就有些乏力了。因為單純的除錯,可能BUG並不會出現。而且一旦出現該種問題,可能會直接導致IDE除錯不可用。
其實,IDE除錯,不僅僅是找BUG解決問題,對於分析程式碼邏輯來說無二選擇。對於某些設計邏輯的實現,是否符合當初的設計。僅僅通過最終結果不能證明正確,還是需要通過IDE來驗證!殊不知,在破解、逆向領域,除錯絕對的NB,誰會有心情悶頭看那一堆彙編程式碼,直接上偵錯程式分析多好。
小黃鴨除錯法(Rubber duck debugging)
又稱橡皮鴨除錯法,黃鴨除蟲法。就是通過向不懂程式的人(只要是不瞭解要解釋的程式碼的任何一個人都可以,比將你寫的程式碼解釋給你的同事)詳細解釋程式碼,從中發現問題或者獲取靈感! 此概念是參照於一個來自《程式設計師修煉之道》書中的一個故事。傳說中程式大師隨身攜帶一隻小黃鴨,在除錯程式碼的時候會在桌上放上這隻小黃鴨,然後詳細地向鴨子解釋每行程式碼。
許多程式設計師都有過向別人(甚至可能向完全不會程式設計的人)提問及解釋程式設計問題,就在解釋的過程中擊中了問題的解決方案。一邊闡述程式碼的意圖一邊觀察它實際上的意圖並做除錯,這兩者之間的任何不協調會變得很明顯,並且更容易發現自己的錯誤。如果沒有玩具小鴨子也可以考慮向其它東西傾訴,比如桌上的花花草草,鍵盤滑鼠。
類似的,有一種現象叫做ConeofAnswers,這是一個常見的現象。你的朋友跑來問你一個問題,但是當他自己把問題說完,或者說到一半的時候就想出了答案走了,留下一臉茫然的你。是的,這個時候你就起到了那隻小黃鴨的作用。
相似的概念還有不少,列如自白除錯、紙板程式設計師或程式設計師的假人、想出腦外等等。總的來說,在你試圖表述自己的想法的過程中,自然地在促使自己去整理思路,重新考慮問題。
這種方法流傳開後,很多程式設計師效仿,開始拿其他玩具,比如手辦、喜歡二次元的、還會拿初音或者是其他公仔呀。
重讀法
這種方法比較簡單直接,就是通過一遍遍地閱讀程式碼來發現問題。
重構法
終極必殺器。如果最終無論如何也不能找到BUG的問題所在,那就直接重構吧!重構有個問題需要注意,就是重構時不要再參看之前的程式碼!重構必須要考慮結構性的設計問題!
當然,對於簡單的程式碼(對整體程式碼結構影響不大),直接重寫會更迅速!
總結
常用的BUG查詢方法基本就是以上這幾種,可能你還有不同的叫法或者其他方法。在實際問題解決中,可能需要多種方法結合使用。
優先解決可重現的bug,有些bug不是很明顯,那麼就想辦法增加他的破壞性,把現象放大,這在我們的系統壓力測試時會經常遇到一種方法。有時候我們甚至需要問自己,如果我要實現bug描述的現象我要怎麼寫程式碼才行?
最後放幾個奇葩註釋!
// _ooOoo_
// o8888888o
// 88" . "88
// (| -_- |)
// O\ = /O
// ____/`---'\____
// . ' \\| |// `.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' | |
// \ .-\__ `-` ___/-. /
// ___`. .' /--.--\ `. . __
// ."" '< `.___\_<|>_/___.' >'"".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `-. \_ __\ /__ _/ .-` / /
// ======`-.____`-.___\_____/___.-`____.-'======
// `=---='
//
// .............................................
// 佛祖鎮樓 BUG辟易
// 佛曰:
// 寫字樓裡寫字間,寫字間里程序員;
// 程式人員寫程式,又拿程式換酒錢。
// 酒醒只在網上坐,酒醉還來網下眠;
// 酒醉酒醒日復日,網上網下年復年。
// 但願老死電腦間,不願鞠躬老闆前;
// 賓士寶馬貴者趣,公交自行程式設計師。
// 別人笑我忒瘋癲,我笑自己命太賤;
// 不見滿街漂亮妹,哪個歸得程式設計師?
//_ooOoo_
//o8888888o
//88" . "88
//(| -_- |)
// O\ = /O
//___/`---'\____
//. ' \\| |// `.
/// \\||| : |||// \
/// _||||| -:- |||||- \
//| | \\\ - /// | |
//| \_| ''\---/'' | |
//\ .-\__ `-` ___/-. /
//___`. .' /--.--\ `. . __
//."" '< `.___\_<|>_/___.' >'"".
//| | : `- \`.;`\ _ /`;.`/ - ` : | |
//\ \ `-. \_ __\ /__ _/ .-` / /
//======`-.____`-.___\_____/___.-`____.-'======
//`=---='
//
// .............................................
// 佛曰:bug氾濫,我已癱瘓!
/*
*
* ┌─┐ ┌─┐
* ┌──┘ ┴───────┘ ┴──┐
* │ │
* │ ─── │
* │ ─┬┘ └┬─ │
* │ │
* │ ─┴─ │
* │ │
* └───┐ ┌───┘
* │ │
* │ │
* │ │
* │ └──────────────┐
* │ │
* │ ├─┐
* │ ┌─┘
* │ │
* └─┐ ┐ ┌───────┬──┐ ┌──┘
* │ ─┤ ─┤ │ ─┤ ─┤
* └──┴──┘ └──┴──┘
* 神獸保佑
* 程式碼無BUG!
*/
/**
*
* __ (__`\
* (__`\ \\`\
* `\\`\ \\ \
* `\\`\ \\ \
* `\\`\#\\ \#
* \_ ##\_ |##
* (___)(___)##
* (0) (0)`\##
* |~ ~ , \##
* | | \##
* | /\ \## __..---'''''-.._.._
* | | \ `\## _.--' _ `.
* Y | \ `##' \`\ \
* / | \ | `\ \
* /_...___| \ | `\\
* / `. | / ##
* | | | / ####
* | | | / ####
* | () () | \ | | _.-' ##
* `. .' `._. |______..| |-'|
* `------' | | | | | || |
* | | | | | || |
* | | | | | || |
* | | | | | || | Joan Stark
* _____ | | | |____| || |
* jgs / `` |-`/ ` |` |
* \________\__\_______\__\
* """"""""" """""""'"""
*
*/
/*
.::::.
.::::::::.
::::::::::: FUCK YOU
..:::::::::::'
'::::::::::::'
.::::::::::
'::::::::::::::..
..::::::::::::.
``::::::::::::::::
::::``:::::::::' .:::.
::::' ':::::' .::::::::.
.::::' :::: .:::::::'::::.
.:::' ::::: .:::::::::' ':::::.
.::' :::::.:::::::::' ':::::.
.::' ::::::::::::::' ``::::.
...::: ::::::::::::' ``::.
```` ':. ':::::::::' ::::..
'.:::::' ':'````..
*/