用gcov来检查Qt C++程序的代码覆盖率

来源:互联网 发布:网络机顶盒销量排行榜 编辑:程序博客网 时间:2024/05/17 06:32

最近才发现MinGW里面包含一个叫做gcov的工具,可以用来检查你的程序运行时调用了哪些代码,同时显示代码行被调用的次数。这个功能在代码的覆盖率和性能调优方便都能用上。

我的运行环境

  • Windows XP
  • MinGW(gcc 4.4.0)
  • Qt 4.8.4

第一步:编写一个可运行的Qt程序

要用到的文件:hihi.cpp, hihi.pro
  • 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.cppQMAKE_CXXFLAGS += --coverageLIBS += -lgcov
hihi.cpp没什么特别的。主要看看hihi.pro. QMAKE_CXXFLAGS += --coverage 用来告诉g++我们要做coverage。LIBS += -lgcov用来链接gcov库

第二步:编译Qt程序

用下面的命令编译hihi工程
D:\workspace\cpp\hihi>qmakeD:\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:}




原创粉丝点击