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


     

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

    我的运行环境

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

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

    要用到的文件:hihi.cpp, hihi.pro
    • hihi.cpp
    1.  
      class Haha
    2.  
      {
    3.  
      public:
    4.  
      void hihi() {
    5.  
      for (int i = 0; i < 100; i++) {
    6.  
      int j = 0;
    7.  
      }
    8.  
      }
    9.  
      };
    10.  
       
    11.  
      int main(int argc, char *argv[])
    12.  
      {
    13.  
       
    14.  
      Haha haha;
    15.  
      haha.hihi();
    16.  
       
    17.  
      return 0;
    18.  
      }
    • hihi.pro
    SOURCES += hihi.cpp
    
    QMAKE_CXXFLAGS += --coverage
    LIBS += -lgcov
    
    hihi.cpp没什么特别的。主要看看hihi.pro. QMAKE_CXXFLAGS += --coverage 用来告诉g++我们要做coverage。LIBS += -lgcov用来链接gcov库
     

    第二步:编译Qt程序

    用下面的命令编译hihi工程
    D:workspacecpphihi>qmake
    D:workspacecpphihi>make release
    现在我们的release目录下就有三个文件了。值得注意的是hihi.gcno文件。它存储的是代码段和对应的行号。
    D:WORKSPACECPPHIHIRELEASE
        hihi.exe
        hihi.gcno
        hihi.o

    第三步:运行Qt程序

    现在运行hihi.exe
    D:workspacecpphihi>releasehihi.exe
    现在我们的release目录下就有四个文件了。比上一步多了一个hihi.gcda。它存储了hihi.exe运行过程中的一些数据。
    D:WORKSPACECPPHIHIRELEASE
        hihi.exe
        hihi.gcda
        hihi.gcno
        hihi.o

    第四步:用gcov来生成报告

    运行如下gcov命令来生成报告。 -o release指的是gcov需要的数据文件hihi.gcno, hihi.gcda都在release目录下。
    D:workspacecpphihi>gcov hihi.cpp -o release
    现在我们的hihi目录下有如下文件。我们要关心的是hihi.cpp.gcov。这个就是hihi.cpp运行的报告文件。
    D:WORKSPACECPPHIHI
    │  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次。
    1.  
      -: 0:Source:hihi.cpp
    2.  
      -: 0:Graph:release/hihi.gcno
    3.  
      -: 0:Data:release/hihi.gcda
    4.  
      -: 0:Runs:1
    5.  
      -: 0:Programs:1
    6.  
      -: 1:class Haha
    7.  
      -: 2:{
    8.  
      -: 3:public:
    9.  
      -: 4: void hihi() {
    10.  
      101: 5: for (int i = 0; i < 100; i++) {
    11.  
      100: 6: int j = 0;
    12.  
      -: 7: }
    13.  
      -: 8: }
    14.  
      -: 9:};
    15.  
      -: 10:
    16.  
      1: 11:int main(int argc, char *argv[])
    17.  
      -: 12:{
    18.  
      -: 13:
    19.  
      -: 14: Haha haha;
    20.  
      -: 15: haha.hihi();
    21.  
      -: 16:
    22.  
      1: 17: return 0;
    23.  
      -: 18:}


  • 相关阅读:
    C#面向对象的基本原则
    EXTJS学习笔记:类似于Window的登录窗体
    c# 类似于QQ表情弹出框功能的二种实现方法
    EXTJS学习笔记:grid之分组实现groupingview
    RibbonBar屏蔽右键
    webservice安全性浅谈
    js生成二维码以及插入图片
    c++之const解惑
    最短路径连接表形式
    深入理解c++之动态内存和指针
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/10598244.html
Copyright © 2020-2023  润新知