您的位置:首页 > 编程语言

代码覆盖率测试工具:gcov+lcov

2017-01-10 09:43 2306 查看


概述

gcov是gcc工具链内含的一个选项,用于测试Code Coverage,包含代码行,函数及分支的覆盖率测试。 

lcov是LTP对gcov扩展的可视化工具,debian系可直接通过apt-get安装,用于生成html格式的详细报告。 

本文仅对gcov+lcov的使用及常用技巧作一个简单介绍。


使用步骤


编译目标代码


测试用户空间代码

在编译时加上两个选项
-fprofile-arcs
-ftest-coverage
,如下
gcc -fprofile-arcs -ftest-coverage -o test test.c


编译生成两个文件,可执行目标文件test和test.gcno,可以看到test文件明显大了许多,在此不论述编译器具体做了什么,有兴趣的可以查看gcov的原理。
root:~# gcc -o test test.c

root:~# ls -l test

-rwxr-xr-x 1 root root 7335 Dec 19 23:12 test

root:~# gcc -fprofile-arcs -ftest-coverage -o test test.c

root:~# ls -l test

-rwxr-xr-x 1 root root 22016 Dec 19 23:12 test



测试内核空间代码

打开kernel gcov选项
# 在.config中添加

CONFIG_DEBUG_FS=y

CONFIG_GCOV_KERNEL=y


设置测试目标代码
#若测试整个内核,在.config中添加

CONFIG_GCOV_PROFILE_ALL=y

#若测试某一个目录下所有文件,在目录Makefile中添加

GCOV_PROFILE=y

#若测试目录下某几个文件,在目录Makefile中添加

GCOV_PROFILE_file1_name.o=y

GCOV_PROFILE_file2_name.o=y


生成的gcno文件位置为
out/target/***/obj/kernel/***


运行测试

测试过程会生成 "*.gcda" 文件,对于内核代码,gcda文件的位置为
/sys/kernel/debug/gcov/$KERNEL_PATH/


生成报告

lcov生成文本格式报告
#将gcda和gcno文件放在同一目录下,在该目录下执行

lcov -b <测试代码路径> -d . -c -o result.info --rc lcov_branch_coverage=1


--rc lcov_branch_coverage=1
表示包含分支数据,lcov支持很多选项,具体可参考其Manpage 

生成的info文件格式如下,包含了代码路径及每一行的调用次数,希望大家不要直接修改这个文件来伪造测试结果
SF:[测试代码路径]

FN:[行号],[函数名]

DA:[行号],[执行次数]

LF:被统计的总行数

LH:被执行的行数

end_of_record


genhtml生成html报告
# 会生成result文件夹,可通过index.html进行查看

genhtml -o result result.info --rc lcov_branch_coverage=1



使用技巧


整合测试结果

将多个测试阶段的报告进行整合,这个功能在测试内核驱动时特别有用,因为有时需要重启进行第二阶段测试,但重启后覆盖率信息将会被重置,就需要将coverage info先保存下来,然后将多个info整合生成最终的报告,如:
#测试阶段1完成,pull出gcda文件,生成phase1.info

#重启

#测试阶段2完成,pull出gcda文件,生成phase2.info

#整合phase1.info和phase2.info

lcov -a phase1.info -a phase2.info -o out.info

#生成html报告,为两次测试结果汇总

genhtml -o result out.info


在添加新的测试后,之前的测试不用重新跑过,只需要得到新的测试报告,将报告进行叠加即可。


match错误

在使用lcov生成.info文件时,有时会报match错误,这种情况一般有两种原因
gcda与gcno对应的不是同一次build的镜像,可通过如下命令查看,两次tag相同则为同一次编译的,否则只能重新编译测试
$ hexdump -e '"%x\n"' -s8 -n4 usb.gcno

6f88d714

$ hexdump -e '"%x\n"' -s8 -n4 usb.gcda

6f88d714


编译代码的主机与生成报告的主机源码绝对路径不同


修改阈值

genhtml默认:90%+为绿色,75%~90%为黄色,75%以下为红色 

我们也可以根据项目要求自定义阈值,lcov/genhtml支持通过 –rc 传输一些配置参数。 

其中与阈值相关设置项:
genhtml_hi_limit -> 全局

genhtml_med_limit -> 全局

genhtml_branch_hi_limit -> 分支

genhtml_branch_med_limit -> 分支

genhtml_function_hi_limit -> 函数

genhtml_function_med_limit -> 函数


包含了全局,分支及函数的阈值设置,以单独设置为准。如果你定义了genhtml_hi_limit和genhtml_branch_hi_limit,对branch来说还是以genhtml_branch_hi_limit为准,而line和function则使用全局的设置。所以虽然没有line的单独设置项,也是可以分别设置line,function和branch的阈值。


链接出错

注意链接时需要加上选项 
-lgcov
,否则会报如下类似错误
undefined reference to `__gcov_init'


有兴趣的查看lcov/genhtml的源码,就是两个perl脚本,一般位置在 /user/local/bin/lcov /user/local/bin/genhtml

相关链接:
Linux平台代码覆盖率测试工具GCOV简介,此博主有一系列gcov相关的博文,且比较详细
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  gcov lcov 覆盖率