前言
gcov是在代码运行时统计代码覆盖率的工具,随着gcc一起发布的。
它的使用很简单,需要在编译和链接时增加-fprofile-arcs -ftest-coverage生成二进制文件。
gcov主要使用.gcno和.gcda两个文件。
.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
参考:传送门
实际测试
上一个简单的测试代码vector.cpp:
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
double average(const vector<double> &array){
double sum = 0;
for(int i = 0;i<array.size();i++)
sum+=array[i];
return sum/array.size();
}
int main(){
vector<double> array = {2.234123412,143213.22342,3124132.41};
for(auto i= array.begin();i!=array.end();i++){
cout.width(16);
cout<<setprecision(16)<<*i<<" ";
}
cout<<endl;
for(auto m:array){
cout.width(16);
cout<<setprecision(16)<<m<<" ";
}
cout<<endl;
return 0;
}
(1)编译时加上-fprofile-arcs -ftest-coverage选项。
g++ -fprofile-arcs -ftest-coverage vector.cpp
(2)运行 ./a.out
编译后,多了.gcno文件,运行后多了.gcda文件。
(3)运行gcov
gcov vector.cpp
Lines executed:70.59% of 17,共17行,覆盖率70.59%。
vi vector.cpp.gcov
以上代码中,空行为-,前面数字是执行的次数,#####是未被执行的行。课件average函数未被执行。