天天看點

[其他] 代碼覆寫率檢查 gcov 和 lcov

前言:

代碼覆寫率檢查是隻在一次程式運作過程中,哪些代碼和函數被運作到了,哪些沒有被運作到,以此來觀察是否又無用代碼,同時也能觀察哪些代碼被頻繁運作,進而可以進行針對性的優化。

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 結果為:

[其他] 代碼覆寫率檢查 gcov 和 lcov

如果不包裹:

void func()
{
   1==1;
}      

則結果為:

[其他] 代碼覆寫率檢查 gcov 和 lcov