Linux下gcov和lcov代码覆盖率分析(C/C++覆盖率在NGINX测试中的应用)
Linux下gcov和lcov代碼覆蓋率分析方法
gcov是Linux下GCC自帶的一個C/C++代碼覆蓋率分析工具
使用方法:在gcc或者g++后面添加參數 -fprofile-arcs -ftest-coverage
注意:-fprofile-arcs -ftest-coverage必須同時在編譯器和鏈接器上設置,(makefile里面可以加在 CFLAGS 和 LDFLAGS上),如果連接的時候出現undefined reference to `__gcov_init' 錯誤,則還要加上-lgocv
編譯成功后運行編譯好的程序,然后退出程序。程序會在當前目錄下生成*.gcda文件。
然后使用 gcov *.c 或者gcov *.cpp生成代碼覆蓋信息,這個時候需要將原始代碼文件*.cpp或者*.c放在*.gcda文件一個目錄中。
完成后會生成*.c.gcov或者*.cpp.gcov文件,里面包含了代碼覆蓋信息。
?
由于*.gcov是文字模式的,linux還自帶了一個lcov工具,可以幫助我們把文字的信息轉換成更直觀的圖形表格模式。
lcov -d . -t '表格名稱' -o '文件名稱.info' -b . -c
此時還沒完,這個指令只是輸出了一個 info 的中間文件,要變成html格式的圖形文件還要下面的指令:
genhtml -o 輸出目錄名 文件名.info
這樣才會在輸出目錄中生成完整的html圖形文件,用瀏覽器在文件目錄中打開index文件就能看到了。
?
C/C++程序的代碼覆蓋率統計工具非常少,與JAVA相比開源免費的工具更是寥寥無幾,好用又開源的簡直是鳳毛麟角。左挑右選最后看中了基于GCOV的LCOV作為NGINX測試的覆蓋率統計工具。選擇LCOV的原因很簡單:一是適合GCOV是GCC配套的測試覆蓋率工具;二是NGINX是純C的程序,GCOV對純C代碼的覆蓋率展現更加精確;三是LCOV作為GCOV的擴展,能夠生成直觀的HTML的帶源碼的覆蓋率報表。
那么下面就來看看,怎么通過LCOV來展現NGINX測試代碼覆蓋率的情況。
一、下載和安裝
1、LCOV的主頁:http://ltp.sourceforge.net/coverage/lcov.php
2、如果你有root權限解壓后直接make insall安裝到系統的執行目錄,然后在任意地方都可以執行LCOV工具的命令了。
3、如果你沒有root或者sudo的權限,也沒問題,可以直接在Makefile里定義PREFIX變量并指向擁有權限的安裝目錄(例如:PREFIX=/home/mylcov),然后make install安裝到指定的目錄,通過帶路徑的命令形式來使用LCOV工具的命令(例如:/home/mylcov/lcov …)。
4、GCOV無需安裝,伴隨著GCC和LINUX一起發行。
二、如何統計覆蓋率
1、要讓LCOV能最后統計并展現出覆蓋率,需要在編譯被測的NGINX的時候添加一些選項,從而打開GCOV的代碼覆蓋率支持。 編譯選項:-fprofile-arcs -ftest-coverage 鏈接選項:-lgcov NGINX使用autoconf生成makefile,我們只需要在configure時加入以上的選項,請執行以下的命令行開啟NGINX的代碼覆蓋率功能。
./configure–with-pcre –with-http_ssl_module –with-cc-opt=”-fprofile-arcs -ftest-coverage” –with-ld-opt=-lgcov標紅加粗的部分就是前述的選項。
2、編譯安裝NGINX并初始化LCOV統計數據 在執行完剛才的CONFIGURE命令后,直接make 和make install就把帶有統計代碼覆蓋的NGINX版本安裝好了。這個時候會發現在源碼的編譯目錄里有不少.gcno和.gcda文件,.gcno是覆蓋率統計的路徑弧長文件,.gcda是覆蓋率文件。 我們接下來要做的事情是要將覆蓋率的數據初始化,并且今后在每次重新統計覆蓋率之前都需要進行初始化。在剛才源碼的編譯目錄中執行lcov –d ./ -z,意思是將當前目錄(./)下的gcda覆蓋率文件清空,是覆蓋率數據回復到空的狀態。
3、啟動NGINX執行各種各樣的測試吧
4、測試執行完成,收集覆蓋率數據 依然是在NGINX源碼編譯目錄下執行lcov –b ./ -d ./ -c –o outputfile.info,意思是統計的相對目錄是當前目錄,對當前目錄下的覆蓋率數據進行采集,并匯總到名為outputfile.info的文件中。
5、利用匯總的數據文件生成直觀的網頁形式的帶有代碼覆蓋情況的報告 在outputfile.info所在目錄下執行genhtml outputfile.info,意思是利用匯總數據文件outputfile.info生成一些列的網頁格式的報告。
三、LCOV的優勢和弱點
LCOV基于GCOV進行測試覆蓋率的統計,LCOV本身也是為了LINUX內核測試覆蓋率而生的,因此對于LINUX下GCC編譯的程序有很好的支持,并且通過html形式的報告展現給測試人員,結果非常直觀并且利于分析。LCOV測試的覆蓋率的種類也比較全面,行覆蓋、分支覆蓋、函數覆蓋。 但是也有令人遺憾的地方對于以so形式存在的動態鏈接庫文件不能給予支持,對于完全C++編寫的代碼的覆蓋率統計結果是以C++代碼被編譯器處理過后的C 形式來統計的,所以覆蓋的數據和實際代碼展示頁中的情況略有出入,但是仍然可以作為測試覆蓋率的參考。 總體來說LCOV對于NGINX這樣的純C的靜態編譯的程序是能夠非常好的滿足代碼覆蓋率統計的需求的。
總結
以上是生活随笔為你收集整理的Linux下gcov和lcov代码覆盖率分析(C/C++覆盖率在NGINX测试中的应用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL引擎:MyIsam和Innod
- 下一篇: Linux vim编辑器命令总结(转载)