用gcov来检查Qt C++程序的代码覆盖率
最近才发现MinGW里面包含一个叫做gcov的工具,可以用来检查你的程序运行时调用了哪些代码,同时显示代码行被调用的次数。这个功能在代码的覆盖率和性能调优方便都能用上。
我的运行环境
- Windows XP
- MinGW(gcc 4.4.0)
- Qt 4.8.4
- hihi.cpp
-
class Haha
-
{
-
public:
-
void hihi() {
-
for (int i = 0; i < 100; i++) {
-
int j = 0;
-
}
-
}
-
};
-
-
int main(int argc, char *argv[])
-
{
-
-
Haha haha;
-
haha.hihi();
-
-
return 0;
-
}
- hihi.pro
SOURCES += hihi.cpp
QMAKE_CXXFLAGS += --coverage
LIBS += -lgcov
hihi.cpp没什么特别的。主要看看hihi.pro. QMAKE_CXXFLAGS += --coverage 用来告诉g++我们要做coverage。LIBS += -lgcov用来链接gcov库D:\workspace\cpp\hihi>qmake
D:\workspace\cpp\hihi>make release
现在我们的release目录下就有三个文件了。值得注意的是hihi.gcno文件。它存储的是代码段和对应的行号。D:\WORKSPACE\CPP\HIHI\RELEASE
hihi.exe
hihi.gcno
hihi.o
第三步:运行Qt程序
现在运行hihi.exe
D:\workspace\cpp\hihi>release\hihi.exe
现在我们的release目录下就有四个文件了。比上一步多了一个hihi.gcda。它存储了hihi.exe运行过程中的一些数据。D:\WORKSPACE\CPP\HIHI\RELEASE
hihi.exe
hihi.gcda
hihi.gcno
hihi.o
第四步:用gcov来生成报告
运行如下gcov命令来生成报告。 -o release指的是gcov需要的数据文件hihi.gcno, hihi.gcda都在release目录下。
D:\workspace\cpp\hihi>gcov hihi.cpp -o release
现在我们的hihi目录下有如下文件。我们要关心的是hihi.cpp.gcov。这个就是hihi.cpp运行的报告文件。D:\WORKSPACE\CPP\HIHI
│ hihi.cpp
│ hihi.cpp.gcov
│ hihi.pro
│ Makefile
│ Makefile.Debug
│ Makefile.Release
│
├─debug
└─release
hihi.exe
hihi.gcda
hihi.gcno
hihi.o
第五步:查看报告
hihi.cpp.gcov是一个文本文件,内容如下。报告一目了然,最左侧显示的是该行代码运行的次数。比如第5行for语句运行了101次。-
-: 0:Source:hihi.cpp
-
-: 0:Graph:release/hihi.gcno
-
-: 0:Data:release/hihi.gcda
-
-: 0:Runs:1
-
-: 0:Programs:1
-
-: 1:class Haha
-
-: 2:{
-
-: 3:public:
-
-: 4: void hihi() {
-
101: 5: for (int i = 0; i < 100; i++) {
-
100: 6: int j = 0;
-
-: 7: }
-
-: 8: }
-
-: 9:};
-
-: 10:
-
1: 11:int main(int argc, char *argv[])
-
-: 12:{
-
-: 13:
-
-: 14: Haha haha;
-
-: 15: haha.hihi();
-
-: 16:
-
1: 17: return 0;
-
-: 18:}