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