青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-19  評論-21  文章-0  trackbacks-0

     debug可以幫助熟悉系統,可是時間長了會很疲卷,特別是機械的調試,如果還要面對雜亂的代碼,更是雪上加霜。所以要學著從debug中鉆探快樂,在系統的調試過程中發揮想象,嘗試不同的debug方法。

    最近看了《軟件調試實戰》,結合自己的經歷,總結了一下:

    1. 與測試用例相關

       a. 如果不能達到“測試先行”,至少應該在寫完代碼后有相對完整的測試用例。對于正確性的保證和以后重構代碼都是有好處的。

       b. 每次添加新功能或修復了一個bug時,都應該增加測試用例!A歷經千辛萬苦終于fix 了一個bug,很久很久以后,B覺得這段代碼需要改改,于是改了改,后來的結果還是改了,而且順利提交到了庫里(因為A當時遇到的bug 并沒有出現!)

       c. 回歸測試

         修改代碼后進行回歸測試。每次提交一個版本后自動進行回歸測試,保證庫里的代碼的正確性。

       d. 簡化測試用例

         好處:可以排除不起作用的因素;減少測試用例的運行時間;最重要的是,使用測試用例更容易調試(誰愿意處理那些填充了數百或數千項的數據容器呢?)

         方法如: 如果測試例子比較好改,可以將其改小;將輸入集改小

       e. 完成代碼,清理后重新運行所有測試用例。

    2. 關于程序的編譯

      a. 重視編譯期間的warning,最好把warning數減為0. 不要忽略編譯器警告,即使它們可能是無害的。

eg:

int add(int a,int b){

        return a +b ;

}

結果頭文件里聲明成了 extern int add(long a,int b)

會調試死人啊,調程序的時候一看程序定義是對的啊,怎么傳的參數一下就變了;

b. 如果出現莫名其妙的錯誤

      如果是用Makefile組織工程時,考慮make clean,有可能修改數據結構或頭文件后改變了一些東西,但是由于一些未知原因該文件并未重新編譯。如果函數是C函數,有可能調用者和被 調用者的參數的成員和類型不同。如果一個類方法,則訪問任何類成員 都將發生錯誤,因為這兩個類的內存而已幾乎是完全不同的。這可能導致Segmentation falut,或是很久之后才能檢測到的內存破壞。

3. 關于鏈接

a. 鏈接器的基本工作原理

       編譯器或匯編程序將源代碼轉換為機器代碼,并輸出對象誰的。對象文件中包含符號(函數或變量),這些符號有的在本模塊定義的,有的在其他模塊定義的,鏈接器就在鏈接對象文件時把這些未定義的符號與定義它的模塊對應起來。

b. 鏈接順序

     有庫和歸檔文件時 鏈接算法是不一樣的。    

     鏈接器參數順序很重要,對于編譯單元(如對象文件和庫)和搜索路徑來說都是如此。

c. C++中使用C代碼時,用extern c{} 把C代碼包裝一下。

     關于 c++符號和名稱改編:C++允許重載函數,為了生成C++代碼元素的唯一符號,編譯器使一種稱為名稱改編(name mangling)的技術,它將對象的準確規格說明(如會員名空間和函數參數的個數及類型)編碼到符號中。(可以用c++filt解析出來~ eg: c++filt _Z9factoriali的結果為factorial(int))

d. 環境變量

   LD_LIBRARY_PATH會影響動態加載的庫,用LDD可以看到程序依賴哪個動態庫

4. 自動化測試

   讓一切自動化起來。如果重復的做一件事,就很有必要考慮自動化了。

5. 關于那些怪異的錯誤

    在一些顯而易見有內存問題的情況下,如:間歇故障和無法解釋的隨機行為,這時考慮使用內存調試器了!

    如valgrind,很好用,也很簡單。

    valgrind –tool=massif your_program 進行內存剖析(檢測內存分配情況,優化內存使用)

    valgrind –tool=memcheck your_program 進行內存檢查(檢測無效的寫訪問,檢測對未初始化的內存的讀取操作,檢測內存泄露等)

    valgrind –tool=helgrind your_program 查找競爭條件,可以用來輔助調試多線程程序

    valgrid –-db-attac=yes的功能很好用,可以將內存高度器和源代碼測試器(如gdb)結合起來,這樣就可以即時查看當時的變量的值,很好用!

6. 靜態檢查器

   作為常規軟件構建過程中的一部分運行,用于查找一些可通過靜態源代碼分析發現的特定bug。

7. 關于運行時剖析工具

     不要編寫自己的運行時剖析時工具:自己霞友云朋一的剖析 工具通常使用系統調用time()或ctime()來測量時間。這些系統調用的問題是開銷很高,而且準確度低。另處在剖析期間要收集大量數據,可能會影響程序本身的行為。

8. 環境變量

  如程序的行為可能 依賴于當前工作目錄。在linux上,目錄被注冊到環境變量CWD上。這個bug碰到過,還導致了死鎖。

9. 讀取恰當的錯誤消息

  某個地方出錯時,滿屏都是錯誤消息時,應該重點關注哪些消息?

  Answer: 首先出現的那些消息!因為后面的消息有可能是前面導致的。這和編譯出錯時的情景一致:編譯錯誤有很多,我們肯定會直覺地去尋找第一個出錯的 地方,誰知道是不是少了個括號導致后面一連串的錯誤。

10. bug不會自動消失

      如果某個版本有bug,update后,bug消失了,“真好!”,一定要弄清楚bug出現的原因是什么。以前遇到過一個bug,增加一條printf語句后,bug消失了!最后發現問題是數組越界了,而修改源代碼會導致代碼段,數據段的布局等改變,所以會導致偶爾對。(這種情況可以求助于內存調試工具或者靜態檢查的工具)

11. 學習使用gcc, gdb,strace 等工具。(熟悉以后可以再挖掘挖掘,可能有驚喜)

12. cvs/svn commit之前一定要diff一下,看做了哪些修改,以避免不小心刪掉一些東西后,然后”被提交”了。

最后,最強大的工具不在計算機中,而是調試者的判斷力和分析技巧。

   參考資料:

   1. 《軟件調試實戰》:http://book.douban.com/subject/4231293/

posted on 2011-05-17 20:26 hex108 閱讀(479) 評論(0)  編輯 收藏 引用 所屬分類: Program
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产免费成人在线视频| 欧美bbbxxxxx| 91久久黄色| 亚洲视频一区二区在线观看| 亚洲美洲欧洲综合国产一区| av成人免费在线观看| 午夜精品在线视频| 亚洲第一页自拍| 欧美成人精品在线播放| 亚洲毛片网站| 免费在线日韩av| 国产伦精品免费视频| 亚洲精品一区二区三| 久久精品一本| 亚洲一本视频| 国产精品v欧美精品v日本精品动漫 | 精品成人一区二区三区| 国产精品第一区| 一色屋精品亚洲香蕉网站| 亚洲影院色无极综合| 亚洲欧美电影在线观看| 欧美日韩日日骚| 国产精品白丝av嫩草影院| 亚洲激情欧美激情| 性做久久久久久久久| 欧美激情一区在线观看| 亚洲中字在线| 欧美三级乱人伦电影| 亚洲——在线| 亚洲性视频网站| 伊人精品成人久久综合软件| 99精品免费视频| 欧美二区在线观看| 欧美电影在线免费观看网站| 亚洲大黄网站| 亚洲激情二区| 欧美日韩午夜激情| 亚洲一区二区成人| 亚洲视频久久| 伊人成人在线视频| 亚洲片在线观看| 国产精品久久久久久久久免费 | 久久精品国产亚洲高清剧情介绍| 欧美精品免费播放| 亚洲欧美国产精品桃花| 亚洲欧美在线另类| 好吊日精品视频| 亚洲人体影院| 激情五月综合色婷婷一区二区| 亚洲日本黄色| 一区二区三区在线视频免费观看| 最新亚洲电影| 激情小说另类小说亚洲欧美| 亚洲肉体裸体xxxx137| 亚洲最新色图| 亚洲激情成人网| 欧美一区二区在线播放| 一区二区三区国产盗摄| 免费成人你懂的| 久久久久国产精品一区三寸| 欧美午夜免费| 夜夜嗨av一区二区三区免费区| 韩国成人精品a∨在线观看| 一本综合精品| 一区二区三区四区蜜桃| 美女被久久久| 亚洲国产精品999| 亚洲精品综合久久中文字幕| 欧美在现视频| 欧美激情a∨在线视频播放| 亚洲高清视频一区二区| 麻豆av一区二区三区| 亚洲国产精品久久久久婷婷884 | 一区二区日韩伦理片| 亚洲精品一区二区在线| 欧美精品1区| 亚洲午夜精品一区二区| 久久久久久久波多野高潮日日| 国产一区二区三区久久| 久久人人爽人人爽| 999亚洲国产精| 欧美综合77777色婷婷| 亚洲国产天堂久久综合网| 欧美巨乳在线| 久久久久久9| 亚洲日韩中文字幕在线播放| 午夜欧美精品久久久久久久| 国产一区二区三区在线观看免费视频 | 国产人久久人人人人爽| 久久女同精品一区二区| 亚洲精品网站在线播放gif| 欧美在线免费视频| 国产精品99久久久久久人| 国产精品激情av在线播放| 夜色激情一区二区| 久久日韩粉嫩一区二区三区| 中文av一区特黄| 国产一区二区三区在线观看视频 | 国产精品成人免费| 日韩视频免费观看| 久久久噜噜噜久久人人看| 亚洲第一级黄色片| 久久一区中文字幕| 欧美一区二区三区视频在线 | 亚洲无限乱码一二三四麻| 亚洲成色777777在线观看影院| 国产亚洲女人久久久久毛片| 欧美色欧美亚洲高清在线视频| 欧美第一黄网免费网站| 欧美高清在线观看| 免费在线日韩av| 欧美日韩一区在线观看| 欧美日韩亚洲不卡| 国产精品丝袜xxxxxxx| 国产性做久久久久久| 激情久久久久久| 日韩一区二区精品视频| 午夜免费在线观看精品视频| 久久人人97超碰精品888| 免费观看久久久4p| 欧美视频一区二| 国产婷婷97碰碰久久人人蜜臀| 国产在线观看精品一区二区三区 | 亚洲二区在线视频| 亚洲系列中文字幕| 免费在线国产精品| 中文网丁香综合网| 欧美电影在线免费观看网站| 国产日韩在线一区| 日韩午夜精品| 久久久久久亚洲综合影院红桃| 91久久精品久久国产性色也91| 一区二区三区导航| 美国十次了思思久久精品导航| 国产亚洲欧美一区在线观看| 亚洲日产国产精品| 乱中年女人伦av一区二区| 亚洲国产欧美在线人成| 欧美中文字幕| 国产综合视频| 麻豆精品一区二区av白丝在线| 亚洲系列中文字幕| 国产免费成人| 久久精品五月婷婷| 午夜精品影院| 加勒比av一区二区| 欧美电影免费观看网站| 久久久青草婷婷精品综合日韩 | 亚洲青涩在线| 欧美国产三级| 国产精品v日韩精品v欧美精品网站| 亚洲经典三级| 99国产成+人+综合+亚洲欧美| 国产精品va| 久久久久久久久久久久久9999| 欧美一区二区三区在线看 | 欧美呦呦网站| 午夜久久久久久久久久一区二区| 亚洲激情成人在线| 国产精品美女久久久| 久久久久免费| 欧美国产一区二区三区激情无套| 日韩视频在线免费| 欧美在线观看视频| 日韩亚洲国产欧美| 久久精品在线免费观看| 亚洲国产一区二区视频| 亚洲欧洲在线观看| 在线看视频不卡| 久久精彩免费视频| 久久久综合视频| 国产伦精品一区二区三区免费| 亚洲福利视频免费观看| 黄色另类av| 欧美99久久| 久久综合综合久久综合| 亚洲国产一二三| 国产毛片一区二区| 久久爱另类一区二区小说| 国产精品亚洲片夜色在线| 亚洲一区二区免费视频| 久久久www成人免费无遮挡大片| 99re热精品| 亚洲免费观看高清完整版在线观看熊| 亚洲色诱最新| 正在播放欧美一区| 欧美激情一区二区久久久| 老妇喷水一区二区三区| 国产日韩精品一区二区三区 | 一本色道久久综合狠狠躁篇的优点 | 午夜精品一区二区三区电影天堂| 欧美精品成人91久久久久久久| 欧美激情aⅴ一区二区三区| 亚洲精品少妇| 午夜国产精品影院在线观看 | 亚洲丰满在线| 亚洲另类在线视频| 欧美激情一区二区三区成人| 亚洲青色在线| 午夜久久久久久|