Linux中隨手可得的測試、調試、性能檢驗工具

jopen 11年前發布 | 21K 次閱讀 Linux
  原定標題是“linux自帶的測試、調試、性能工具”,不過并不恰當,比如本文要提到的gdb,很多Linux發行版中都提供了它,但畢竟不是Linux的必要組成部分,只是對與大多數Linux用戶隨手可得罷了。合理組合使用這些工具可以滿足更復雜的要求,并寫成測試腳本,能為測試提供很大的方便。本文不涉及具體的腳本編寫,也不涉及與網絡相關的命令如netstat和 tcpdump。
  為了方便閱讀,用橫線把內容進行分割,并且每個下劃線下對這部分主要內容進行提示。
  對于1~6這幾個命令,單獨使用時看上去很簡單,但當它們結合重定向和正則表達式從而構成更復雜的功能甚至是自動化腳本時,才能發揮其真正威力。

  cmp和diff可以用于版本控制,比較兩個版本文件的不同之處,也可以用于比較程序產生的輸出。
 
1.cmp
  逐字節比較兩個文件,輸出。無選項則輸出第一個不同的地方。
  常用選項:
  -l 輸出所有不同的字節,并顯示字節數(十進制)和每個不同的不同字節(八進制)。例如,如果第3個字節file1.txt中是八進制151,flie2.txt中是12,則顯示:

    3 151  12

 

2.diff

  逐行比較兩個文件;如果指定的是目錄,則比較目錄下的同名文件。

  輸出為:文件1中的行數+格式提示+文件2中的行數,其中格式提示為a、c、d,對應add、change、delete。

  diff的退出值有特定含義, 0 表示沒有不同,1 表示找到不同處,2 表示出錯。

  常用選項:

    -y --side-by-side 以兩列輸出。這時用 |標注二者不同的行,<標注后者比前者少一行,>標注前者比后者少一行。此時還可以加上下面的選項:
      -W NUM --width=NUM 輸出最多打印 NUM (默認 130) 列。
      --left-column 僅輸出共有行的左側列。

    -c  -C NUM  --context[=NUM]  輸出 NUM (默認 3) 行復制的上下文。兩個文件的全文都會顯示。

    -u  -U NUM  --unified[=NUM]  輸出 NUM (默認 3) 行合并的上下文。兩個文件相同的部分只顯示一次。

    -ruN 生成patch文件,格式為diff -ruN file1 file2 >patch.dat,這時使用patch file1 patch.dat就能把file1的內容更新到與file2一致了。

 


  sort、sum、wc同樣可以對文件和輸出按需要進行處理。對于能夠把stdin重定向到文件中的Linux來說,對輸出的處理和對文件的處理是一樣的。

3.sort

  按字母序輸出各行。這個命令可以同時處理多個文件。

  常用選項:

    -u 去除重復行

    -r  降序輸出

    -n 按數字序排序,(這樣2才不會排到10后面)

    -t    按某個分隔符分隔,這時可以用-k指定列數

 

4.sum

  計算文件校驗和以及占用的塊(block)數。校驗和算法和block的大小可以根據選項設定。

 

5.wc

  輸出文件的行數、字(word)數、字節數。如果多于一個文件還將輸出總行數。

  常用選項:

    -c   輸出字節數

    -m  輸出字符數

    -l  輸出行數

    -w  輸出字(word)數

 


6.grep

  從文本中搜索符合正則表達式的內容并顯示。這里就不提正則表達式是多么的強大了,其規則可以單獨寫成一篇博文,并且很多人已經這么做過了。下面是一些用法啟發,看完之后會讓人覺得,原來這個“搜索”的需求的具體化如此多樣。例子出于《程序設計實踐》:

  哪些文件里用到了類Regexp?  %grep Regexp *.java

  這個類的實現在哪個文件?     %grep 'class.*Regexp' *.java

  文件中有多少空行?        %grep '.' *.c++ |wc

 


   運行時間的統計和測定:time和gprof

7.time
  用法是$time 可執行文件/命令
  顯示程序運行的總時間、用戶時間和系統時間。
  對于一個執行時間很短的程序,運行時間可能顯示為0。
  因為并不是由程序執行本身收集的,如果time命令被停止或被換出內存,顯示的時間可能大于真實的時間。
 
8.gprof
  統計程序運行時各個函數的運行時間和被調用的次數。這對代碼調優很有幫助,通過這個統計,可以找到占用時間比率大、調用次數多的函數,對齊進行優化,這樣可以提升程序的性能。而對于較少執行而且占用時間不多的函數,即使存在優化的可能性,也不必費心考慮優化方案,因為對它的優化對性能提升不大。
  如果需要gprof,在gcc時需要增加-pg選項,這時會生成一個gmon.out文件。
 

  代碼查錯:gcc -Wall選項、lint
9.gcc -Wall
  之所以把這個gcc選項也列上,主要是其作用容易被人忽略。Writing Solid Code上援引Peter Lynch——據說是80年代最好的合股投資公司管理者——的話:投資者與賭徒之間的區別在于投資者利用每一次機會,無論它是多么小,去爭取利益;而賭徒則只靠運氣。作者建議把這句話應用于編程,選擇編譯程序的所有可選警告選項,并視之為無風險高償還的程序投資。不要問“應該使用這一警告設施嗎?”而是問:“為什么不使用這一警告設施呢?”把所有警告選項都打開,除非有極好的理由才不這么做。
 
10.lint
  最初lint用于檢查C語言中不可移植的代碼,而現在已經不只是一個可移植性檢查程序,還可以檢查出代碼中那些雖然可移植并且完全合乎語法但很有可能是錯誤的特性。
  lint有很多版本,Linux下可以使用splint,通過apt-get安裝。
 
 

  較綜合的調試:gdb
11.gdb
  gdb是一個較為綜合的調試工具,提供了諸如斷點、變量監測和設置、信號、查看函數堆棧、單步執行等功能,這里不做詳細介紹,相關的博文很多,可以進行參考,我以前也做了個記錄:gdb調試命令
 

  其他:strace
12.strace
  strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。這條命令我之前沒有用過,下面貼一個地址供需要的人進一步研究:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

來自:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/13/3119163.html
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!