GcovGCC Coverage)是一个测试代码覆盖率的工具,是一个命令行方式的控制台程序,伴随GCC发布,配合GCC共同实现对C/C++文件的语句覆盖和分支覆盖测试,与程序概要分析工具(profiling tool,例如gprof)一起工作可以估计程序中哪一段代码最耗时。

gcov可以统计每一行代码的执行频率,实际上哪些代码确实被执行了,每一段代码(section code)的耗时(执行时间)。因此,gcov可以帮你优化代码,当然这个优化动作还是应该由开发者完成。

测试用例:

#include <stdio.h>


int main(int argc, char** argv)
{
    int i, total;
    
    total = 0;
    
    for(i = 0; i < 10; i++) {
        total += i;
    }
    
    if(total != 45) {
        printf("fail!\n");
    } else {
        printf("success!\n");
    }
    
    return 0;
}

编译:

$ g++ -fprofile-arcs -ftest-coverage -o gcov_test gcov_test.cpp 
$ ls
gcov_test  gcov_test.cpp  gcov_test.gcno

-fprofile-arcs -ftest-coverage告诉编译器生成gcov需要的额外信息,并在目标文件中插入gcov需要的extra profiling information。因此,该命令在生成可执行文件gcov_test的同时生成gcov_test.gcno文件(gcov note文件)。

收集信息:

$ ./gcov_test
success!
$ ls
gcov_test  gcov_test.cpp  gcov_test.gcda  gcov_test.gcno

执行该程序,生成gcov_test.gcda文件(gcov data文件)。

报告:

$ gcov gcov_test.cpp 
File\u2018gcov_test.cpp\u2019
\u5df2\u6267\u884c\u7684\u884c\u6570\uff1a87.50% (\u5171 8 \u884c)
\u6b63\u5728\u521b\u5efa 'gcov_test.cpp.gcov'

$ ls
gcov_test  gcov_test.cpp  gcov_test.cpp.gcov  gcov_test.gcda  gcov_test.gcno

生成gcov_test.cpp.gcov文件,该文件记录了每行代码被执行的次数。

$ cat gcov_test.cpp.gcov 
        -:    0:Source:gcov_test.cpp
        -:    0:Graph:gcov_test.gcno
        -:    0:Data:gcov_test.gcda
        -:    0:Runs:1
        -:    0:Programs:1
        -:    1:#include <stdio.h>
        -:    2:
        -:    3:
        1:    4:int main(int argc, char** argv)
        -:    5:{
        -:    6:    int i, total;
        -:    7:    
        1:    8:    total = 0;
        -:    9:    
       11:   10:    for(i = 0; i < 10; i++) {
       10:   11:        total += i;
        -:   12:    }
        -:   13:    
        1:   14:    if(total != 45) {
    #####:   15:        printf("fail!\n");
        -:   16:    } else {
        1:   17:        printf("success!\n");
        -:   18:    }
        -:   19:    
        1:   20:    return 0;
        -:   21:}

参考文章

GCOV 使用用例
gcov lcov 覆盖c/c++项目入门
Linux下c/c++项目代码覆盖率的产生方法
基于GCOV的C/C++代码覆盖率分析工具
Linux性能评测工具之一:gprof篇


txgcwm
764 声望71 粉丝

Linux C/C++