最近才发现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:\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次。

  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:}

最新文章

  1. 【开源】OSharp3.3框架解说系列:开发计划与进度
  2. Create Volume 操作(Part II) - 每天5分钟玩转 OpenStack(51)
  3. 背水一战 Windows 10 (37) - 控件(弹出类): MessageDialog, ContentDialog
  4. mapReduce编程之auto complete
  5. ueditor插件简单使用
  6. ASP.NET mvc异常处理的方法
  7. 微信或移动端网页的meta
  8. 记得ajax中要带上AntiForgeryToken防止CSRF攻击
  9. Android 网络编程--URL互联网资源
  10. R语言的向量化编程思维
  11. kaptcha验证码插件的使用
  12. 超棒的阿里巴巴矢量图标库——支持IE6
  13. C#定义委托函数实现在别的窗体中操作主窗体中的SerialPort控件
  14. 【POJ 1182 食物链】并查集
  15. UISearchBar去除底部黑线问题
  16. PowerDesigner 的mysql PDM 的COMMENT注释
  17. python 自动化之路 day 13
  18. 使用devstack搭建openstack Newton 版本的坑
  19. 投票系统 &amp; js脚本简单刷票
  20. Django连接mysql数据库

热门文章

  1. Vue-img-preload
  2. Spring之Redis访问(Spring-data-redis)
  3. 文件 file open函数的打开及 函数的调用
  4. Linux 下升级Android Studio失败
  5. String 类的常用方法都有那些?(未完成)
  6. 设置IDEA中各种线条颜色
  7. Java查漏补缺
  8. tsung压力测试环境部署详细步骤(内附安装包)
  9. SPOJ 10707 COT2 - Count on a tree II
  10. axios请求提交的form data格式 明明是JSON格式的参数却转成了字符串格式