1. 程式人生 > >常用BUG解決方法

常用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 
                ..:::::::::::' 
              '::::::::::::' 
                .:::::::::: 
           '::::::::::::::.. 
                ..::::::::::::. 
              ``:::::::::::::::: 
               ::::``:::::::::'        .:::. 
              ::::'   ':::::'       .::::::::. 
            .::::'      ::::     .:::::::'::::. 
           .:::'       :::::  .:::::::::' ':::::. 
          .::'        :::::.:::::::::'      ':::::. 
         .::'         ::::::::::::::'         ``::::. 
     ...:::           ::::::::::::'              ``::. 
    ```` ':.          ':::::::::'                  ::::.. 
                       '.:::::'                    ':'````.. 


*/