這裡使用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裡面檔案的内容。