最近才发现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:}

用gcov来检查Qt C++程序的代码覆盖率的更多相关文章

  1. Qt应用程序图标设置

    Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...

  2. 报表控件NCReport教程:集成NCReport到Qt应用程序中

    NCReport是一款轻量级.快速.多平台.简单易用的基于Qt toolkit的C++编写的报表解决方案,目前主要包括报表渲染库和报表设计器GUI应用程序. 但是好多使用NCReport控件的朋友都不 ...

  3. QT添加程序图标及窗口图标

    程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...

  4. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  5. Linux下Qt应用程序的发布(使用LDD命令查看所有依赖的库文件)

    最近一直在学习Qt,用Qt写了一个程序,但是不知道怎么发布,网上说的都是在windows下怎么发布Qt应用程序,但是,在windows下Qt应用程序依赖的库文件与linux下的名字不同.于是,我就想到 ...

  6. 让你的 Qt 桌面程序看上去更加 native(一共六篇)

    <让你的 Qt 桌面程序看上去更加 native>是一个系列文章.在这个系列中,你将会了解到如何让你的 Qt 桌面应用程序看上去更加 native.这里,我假设你已经清楚如何使用 Qt 编 ...

  7. 让qt应用程序支持触摸

    一.设备驱动 我的触摸屏是usb接口的 可以参考下这2篇文件 http://blog.csdn.net/paomadi/article/details/8754783 usb触摸屏 http://bl ...

  8. Qt应用程序中设置字体

    Qt应用程序中设置字体 应用程序中经常需要设置字体,例如office软件或者是其他的编辑器软件等等.这里主要涉及到如下几个概念:字体,字号以及风格(例如:粗体,斜体,下划线等等).Qt里面也有对应的类 ...

  9. CMake结合Visual Studio中开发Qt应用程序注意事项

    Qt工程管理 个人比较偏爱于使用CMake来管理C++工程,因为只要编写一个CMakeLists.txt文件,就可以在Windows和Mac上生成各自的IDE工程.在Windows上, CMake自然 ...

随机推荐

  1. 安卓开发之ListView入门

    <!--这个地方最好用match_parent 这样效率高--> <ListView android:layout_width="match_parent" an ...

  2. LCD1602 液晶

    它是一种专门用来显示字母.数字.符号的点阵型液晶模块 它是由若干个5x7或者5x10的点阵字符位组成 引脚 时序 操作步骤 初始化 写命令(RS=L)设置显示坐标 写数据(RS=H) 指令 清屏: 指 ...

  3. vue项目中图片预览旋转功能

    最近项目中需要在图片预览时,可以旋转图片预览,在网上找了下,发现有一款功能强大的图片组件:viewerjs. git-hup: https://github.com/fengyuanchen/view ...

  4. Hexo NexT主题内加入动态背景

    主题内新添加内容 _layout.swig 找到themes\next\layout\_layout.swig文件,添加内容:在<body>里添加: 1 2 3 <div class ...

  5. asp.net网站部署在云服务器windows server 2008上

    搭建一个网站需要以下4个准备: 1.域名解析 2.(云)服务器 3.数据库 4.网站代码 其中1可以可以去DNSPOD申请,同时需要进行备案,在上面就都可以完成.2用的是阿里云服务器windows s ...

  6. ASP.NET IHttpModule IHttpHandler IHttpHandlerFactory 拦截请求

    先来看看代码,拦截所有Http请求类.下面包含了两种类的集成 IHttpModule IHttpHandlerFactory using System; using System.Collection ...

  7. 前端基础(九):SweetAlert(弹出框)

    简介 SweetAlert是一款很好用的弹出框框架 下载 点我下载 导入 博主用的是bootstrap-sweetalert,所以要依赖bootstrap,导入前先导入原生jQuery以及bootst ...

  8. CentOS 6.10 系统安装

    本章内容: CentOS 6.10 的安装 一.安装光盘,选择 Install or upgrade an existing system 二.选择 skip 跳过光盘检查 三.选择 Next 四.选 ...

  9. HDU - 3506 Monkey Party

    HDU - 3506 思路: 平行四边形不等式优化dp 这不就是石子归并(雾 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma G ...

  10. javascript弹出带文字信息的提示框效果

    // position of the tooltip relative to the mouse in pixel // <html><head><meta charse ...