天天看點

gcov覆寫率測試

這裡使用gcov工具,gcov是伴随着gcc釋出。gcc編譯加入-fprofile-arcs -ftest-coverage參數生成二進制程式,執行測試用例生成代碼覆寫率資訊。

fprofile-arcs參數使gcc建立一個程式的流圖,之後找到适合圖的生成樹。隻有不在生成樹中的弧被操縱 (instrumented):gcc添加了代碼來清點這些弧執行的次數。當這段弧是一個塊的唯一出口或入口時,操縱工具代碼 (instrumentation code)将會添加到塊中,否則建立一個基礎塊來包含操縱工具代碼。gcov主要使用.gcno和.gcda兩個檔案。

.gcno是由-ftest-coverage産生的,它包含了重建基本塊圖和相應的塊的源碼的行号的資訊。

.gcda是由加了-fprofile-arcs編譯參數的編譯後的檔案運作所産生的,它包含了弧跳變的次數和其他的概要資訊。

gcov執行函數覆寫、語句覆寫和分支覆寫。

Lcov則是上的gcov 結果展現的一個前端,可從 http://ltp.sourceforge.net/coverage/lcov.php 下載下傳。可以将覆寫率資訊轉換成html 展現。

案例:

測試mysql新引擎的覆寫率

在根目錄(sql目錄)及引擎目錄下修改makefile檔案:

CXXFLAGS、LIBS變量加上:-fprofile-arcs -ftest-coverage

LDFLAGS = -rdynamic -lgcov

make clean

make

//将新的編譯檔案拷貝到原來的安裝目錄下(必須先關閉mysql服務)

sudo cp .libs/ha_isearch.* /u01/mysql.isearch/lib/mysql/plugin/

sudo cp sql/mysqld /u01/mysql.isearch/libexec/ -f

//其中.libs目錄為存儲引擎生成的動态庫目錄

// /u01/mysql.isearch/lib/mysql/plugin/:為程式安裝後的目錄

// sql/mysqld 是相對于代碼根目錄

//啟動mysql服務,并做一個簡單的測試

select ...

//關閉mysql服務,此時在引擎的代碼目錄下的.libs目錄下會生成一個".gcda"檔案。

//再将".gcda"與".gcno"檔案拷貝到代碼目錄

執行 gcov *.gcda (這個檔案是你想要得到的源檔案編譯後産生的目标檔案.o,一樣的字首名)

此時先顯示相關檔案的覆寫率情況,并得到源碼檔案的ha_innodb.cc.gcov檔案,該檔案就包含了所有路徑的覆寫情況

在測試的時候覆寫情況是追加的,這樣就不必每次都把之前的測試用例跑一遍。(如果要得到新的結果的話隻需要把.gcda檔案删除掉就可以了,不要删除.gcno檔案(如果删除了它的話就必須重新make clean && make),不需要重新編譯)

收集覆寫率資料生成app.info檔案:

lcov --directory . --capture --output-file app.info

此時如果成功顯示如下内容:

Capturing coverage data from .

Found gcov version: 4.1.2

Scanning . for .gcda files ...

Found 2 data files in .

Processing ha_isearch_la-ha_isearch.gcda

Processing .libs/ha_isearch_la-ha_isearch.gcda

Finished .info-file creation

再将app.info轉換為http檔案:

genhtml  -o  results  app.info

成功顯示如下:

Reading data file app.info

Found 8 entries.

Found common filename prefix "/u01/5.1.48.isearch/mysql-5.1.48"

Writing .css and .png files.

Generating output.

Processing file sql/handler.h

Processing file sql/structs.h

Processing file sql/sql_string.h

Processing file sql/mysql_priv.h

Processing file sql/sql_list.h

Processing file storage/isearch/ha_isearch.h

Processing file storage/isearch/ha_isearch.cc

Processing file /usr/include/stdlib.h

Writing directory view page.

Overall coverage rate:

lines......: 59.3% (407 of 686 lines)

functions..: 33.3% (56 of 168 functions)

branches...: 50.3% (145 of 288 branches)

最後在目前目錄下可以看到app.info檔案與results檔案夾。通過浏覽器就可以檢視results裡面檔案的内容。