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可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗的時間。