gcov覆盖率测试
2016-02-03 09:23
555 查看
这里使用gcov工具,gcov是伴随着gcc发布。gcc编译加入-fprofile-arcs -ftest-coverage参数生成二进制程序,执行测试用例生成代码覆盖率信息。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵 (instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码 (instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。gcov主要使用.gcno和.gcda两个文件。
.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
gcov执行函数覆盖、语句覆盖和分支覆盖。
Lcov则是上的gcov 结果展现的一个前端,可从 http://ltp.sourceforge.net/coverage/lcov.php 下载。可以将覆盖率信息转换成html
展现。
案例:
测试mysql新引擎的覆盖率
在根目录(sql目录)及引擎目录下修改makefile文件:
CXXFLAGS、LIBS变量加上:-fprofile-arcs -ftest-coverage
LDFLAGS = -rdynamic -lgcov
make clean
make
//将新的编译文件拷贝到原来的安装目录下(必须先关闭mysql服务)
sudo cp .libs/ha_isearch.* /u01/mysql.isearch/lib/mysql/plugin/
sudo cp sql/mysqld /u01/mysql.isearch/libexec/ -f
//其中.libs目录为存储引擎生成的动态库目录
// /u01/mysql.isearch/lib/mysql/plugin/:为程序安装后的目录
// sql/mysqld 是相对于代码根目录
//启动mysql服务,并做一个简单的测试
select ...
//关闭mysql服务,此时在引擎的代码目录下的.libs目录下会生成一个".gcda"文件。
//再将".gcda"与".gcno"文件拷贝到代码目录
执行 gcov *.gcda (这个文件是你想要得到的源文件编译后产生的目标文件.o,一样的前缀名)
此时先显示相关文件的覆盖率情况,并得到源码文件的ha_innodb.cc.gcov文件,该文件就包含了所有路径的覆盖情况
在测试的时候覆盖情况是追加的,这样就不必每次都把之前的测试用例跑一遍。(如果要得到新的结果的话只需要把.gcda文件删除掉就可以了,不要删除.gcno文件(如果删除了它的话就必须重新make clean && make),不需要重新编译)
收集覆盖率数据生成app.info文件:
lcov --directory . --capture --output-file app.info
此时如果成功显示如下内容:
Capturing coverage data from .
Found gcov version: 4.1.2
Scanning . for .gcda files ...
Found 2 data files in .
Processing ha_isearch_la-ha_isearch.gcda
Processing .libs/ha_isearch_la-ha_isearch.gcda
Finished .info-file creation
再将app.info转换为http文件:
genhtml -o results app.info
成功显示如下:
Reading data file app.info
Found 8 entries.
Found common filename prefix "/u01/5.1.48.isearch/mysql-5.1.48"
Writing .css and .png files.
Generating output.
Processing file sql/handler.h
Processing file sql/structs.h
Processing file sql/sql_string.h
Processing file sql/mysql_priv.h
Processing file sql/sql_list.h
Processing file storage/isearch/ha_isearch.h
Processing file storage/isearch/ha_isearch.cc
Processing file /usr/include/stdlib.h
Writing directory view page.
Overall coverage rate:
lines......: 59.3% (407 of 686 lines)
functions..: 33.3% (56 of 168 functions)
branches...: 50.3% (145 of 288 branches)
最后在当前目录下可以看到app.info文件与results文件夹。通过浏览器就可以查看results里面文件的内容。
fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵 (instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码 (instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。gcov主要使用.gcno和.gcda两个文件。
.gcno是由-ftest-coverage产生的,它包含了重建基本块图和相应的块的源码的行号的信息。
.gcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的,它包含了弧跳变的次数和其他的概要信息。
gcov执行函数覆盖、语句覆盖和分支覆盖。
Lcov则是上的gcov 结果展现的一个前端,可从 http://ltp.sourceforge.net/coverage/lcov.php 下载。可以将覆盖率信息转换成html
展现。
案例:
测试mysql新引擎的覆盖率
在根目录(sql目录)及引擎目录下修改makefile文件:
CXXFLAGS、LIBS变量加上:-fprofile-arcs -ftest-coverage
LDFLAGS = -rdynamic -lgcov
make clean
make
//将新的编译文件拷贝到原来的安装目录下(必须先关闭mysql服务)
sudo cp .libs/ha_isearch.* /u01/mysql.isearch/lib/mysql/plugin/
sudo cp sql/mysqld /u01/mysql.isearch/libexec/ -f
//其中.libs目录为存储引擎生成的动态库目录
// /u01/mysql.isearch/lib/mysql/plugin/:为程序安装后的目录
// sql/mysqld 是相对于代码根目录
//启动mysql服务,并做一个简单的测试
select ...
//关闭mysql服务,此时在引擎的代码目录下的.libs目录下会生成一个".gcda"文件。
//再将".gcda"与".gcno"文件拷贝到代码目录
执行 gcov *.gcda (这个文件是你想要得到的源文件编译后产生的目标文件.o,一样的前缀名)
此时先显示相关文件的覆盖率情况,并得到源码文件的ha_innodb.cc.gcov文件,该文件就包含了所有路径的覆盖情况
在测试的时候覆盖情况是追加的,这样就不必每次都把之前的测试用例跑一遍。(如果要得到新的结果的话只需要把.gcda文件删除掉就可以了,不要删除.gcno文件(如果删除了它的话就必须重新make clean && make),不需要重新编译)
收集覆盖率数据生成app.info文件:
lcov --directory . --capture --output-file app.info
此时如果成功显示如下内容:
Capturing coverage data from .
Found gcov version: 4.1.2
Scanning . for .gcda files ...
Found 2 data files in .
Processing ha_isearch_la-ha_isearch.gcda
Processing .libs/ha_isearch_la-ha_isearch.gcda
Finished .info-file creation
再将app.info转换为http文件:
genhtml -o results app.info
成功显示如下:
Reading data file app.info
Found 8 entries.
Found common filename prefix "/u01/5.1.48.isearch/mysql-5.1.48"
Writing .css and .png files.
Generating output.
Processing file sql/handler.h
Processing file sql/structs.h
Processing file sql/sql_string.h
Processing file sql/mysql_priv.h
Processing file sql/sql_list.h
Processing file storage/isearch/ha_isearch.h
Processing file storage/isearch/ha_isearch.cc
Processing file /usr/include/stdlib.h
Writing directory view page.
Overall coverage rate:
lines......: 59.3% (407 of 686 lines)
functions..: 33.3% (56 of 168 functions)
branches...: 50.3% (145 of 288 branches)
最后在当前目录下可以看到app.info文件与results文件夹。通过浏览器就可以查看results里面文件的内容。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍