前言:
代碼覆寫率檢查是隻在一次程式運作過程中,哪些代碼和函數被運作到了,哪些沒有被運作到,以此來觀察是否又無用代碼,同時也能觀察哪些代碼被頻繁運作,進而可以進行針對性的優化。
gcov 用來生成報告,lcov用來把 gcov 生成的報告做二次加工成,比如做成 html 網頁。
使用gcov生成報告:
2.c:
void func()
{
1==1;
}
int main(int argc,char** agrv)
{
int i = 0;
if (1>2){
i++;
}else{
i--;
}
}
編譯:
gcc -fprofile-arcs -ftest-coverage 2.c -o 2
運作:
./2
生成報告:
gcov 2.c
這個時候會得到一個檔案 2.c.gcov ,打開檔案就可以看到如下結果:
-: 0:Source:2.c
-: 0:Graph:2.gcno
-: 0:Data:2.gcda
-: 0:Runs:1
-: 0:Programs:1
#####: 1:void func()
-: 2:{
-: 3: 1==1;
#####: 4:}
-: 5:
-: 6:
1: 7:int main(int argc,char** agrv)
-: 8:{
1: 9: int i = 0;
-: 10: if (1>2){
-: 11: i++;
-: 12: }else{
1: 13: i--;
-: 14: }
-: 15:}
-: 16:
此外還會有兩個額外的檔案 2.gcda 和 2.gcno ,2.gcno 是在編譯時生成,2.gcda 是在運作時生成的,暫且不管他們的作用。
使用 lcov 生成彙總報告和 html 網頁:
生成報告:
lcov -t "anyNameOfCurrentTest" -o result.info -c -d .
注意,這裡的 -t 後跟着本次操作的名稱,可以任意取名字,-o 後跟着結果檔案名稱,-c 表示抓取覆寫資料,-d 後跟着 2.gcda 和 2.gcno 這兩個檔案的存放路徑,這點很重要。
操作完畢後會生成一個檔案 result.info
生成 html 網頁:
genhtml -o result result.info
這個時候會得到一個檔案夾叫做 result,裡面有:
├── amber.png
├── emerald.png
├── gc
│ ├── 2.c.func.html
│ ├── 2.c.func-sort-c.html
│ ├── 2.c.gcov.html
│ ├── index.html
│ ├── index-sort-f.html
│ └── index-sort-l.html
├── gcov.css
├── glass.png
├── index.html
├── index-sort-f.html
├── index-sort-l.html
├── ruby.png
├── snow.png
└── updown.png
用浏覽器打開 index.html 即可得到彙總結果。
LCOV 例外處理:
有時候某些函數和某些語句就是不會覆寫,然後我們又不想把這些語句和函數納入統計,作為例外。那麼可以使用 // LCOV_EXCL_START 和 // LCOV_EXCL_STOP 把相應的語句和函數包裹起來即可。比如:
// LCOV_EXCL_START
void func()
{
1==1;
}
// LCOV_EXCL_STOP
如果對這個函數包裹,那麼html 結果為:
如果不包裹:
void func()
{
1==1;
}
則結果為: