CC++代码覆盖率工具gcov、lcov

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CC++代码覆盖率⼯具gcov、lcov
gcov是⼀个可⽤于C/C++的代码覆盖⼯具,是gcc的内建⼯具。

下⾯介绍⼀下如何利⽤gcov来收集代码覆盖信息。

想要⽤gcov收集代码覆盖信息,需要在gcc编译代码的时候加上这2个选项 “-fprofile-arcs -ftest-coverage”,把这个简单的程序编译⼀下
gcc -fprofile-arcs -ftest-coverage hello.c -o hello
编译后会得到⼀个可执⾏⽂件hello和hello.gcno⽂件,当⽤gcc编译⽂件的时候,如果带有“-ftest-coverage”参数,就会⽣成这个.gcno⽂件,它包含了程序块和⾏号等信息
接下来可以运⾏这个hello的程序
./hello 5
./hello 12
运⾏结束以后会⽣成⼀个hello.gcda⽂件,如果⼀个可执⾏⽂件带有“-fprofile-arcs”参数编译出来,并且运⾏过⾄少⼀次,就会⽣成。

这个⽂件包含了程序基本块跳转的信息。

接下来可以⽤gcov⽣成代码覆盖信息:
gcov hello.c
运⾏结束以后会⽣成2个⽂件hello.c.gcov和myfunc.c.gcov。

打开看⾥⾯的信息:
-: 0:Source:myfunc.c
-: 0:Graph:hello.gcno
-: 0:Data:hello.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include
-: 2:
-: 3:void test(int count)
1: 4:{
-: 5: int i;
10: 6: for (i = 1; i < count; i++)
-: 7: {
9: 8: if (i % 3 == 0)
3: 9: printf (“%d is divisible by 3 \n”, i);
9: 10: if (i % 11 == 0)
#####: 11: printf (“%d is divisible by 11 \n”, i);
9: 12: if (i % 13 == 0)
#####: 13: printf (“%d is divisible by 13 \n”, i);
-: 14: }
1: 15:}
被标记为#####的代码⾏就是没有被执⾏过的,代码覆盖的信息是正确的,但是让⼈去读这些⽂字,实在是⼀个杯具。

不⽤担⼼,有另外⼀个⼯具叫lcov,可以⽤程序解析这些晦涩的字符,最终输出成html格式的报告,很好吧!
lcov -d . -t ‘Hello test’ -o ‘hello_’ -b . -c
指定lcov在当前⽬录“.”去找代码覆盖的信息,输出为’hello_’ ,这个hello_是⼀个中间结果,需要把它⽤genhtml来处理⼀下,genhtml是lcov⾥⾯的⼀个⼯具。

genhtml -o result hello_
指定输出⽬录是 result。

⼀个完整的html报告就⽣成了,做⼀个连接,把这个⽬录连到随便⼀个web server的⽬录下,就可以看报告了。

本⼈的⼯程是使⽤了lcov,并使⽤makefile,主要的⽤法如下:
在makefile中定义宏⽂件:
PROFILE
1. ifeq ($(PROFILE),1)
2. CFLAGS += -fprofile-arcs
3. CFLAGS += -ftest-coverage
4. CXXFLAGS += -fprofile-arcs
5. CXXFLAGS += -ftest-coverage
6. LDFLAGS += -fprofile-arcs
7. LDFLAGS += -ftest-coverage
8. LDFLAGS += -lgcov
9. LIBLDFLAGS += -fprofile-arcs
10. LIBLDFLAGS += -ftest-coverage
11. LIBLDFLAGS += -lgcov
12. endif
在编译的时候打开此宏:PROFILE=1 make rtm DEBUG=0
然后运⾏后⽣成*.gcda⽂件。

使⽤下⾯命令⽣成report:
1. lcov -d . -b . -c -o $rtmcovfile >/dev/null
2. #sed -i -e 's#/home/mac_ci/hudson/home/jobs/trunk_RTM/workspace/trunk#\.#g' $rtmcovfile
3. # - only keep ssTddPs folders in the report
4. lcov -r $rtmcovfile "*/SS_MacData/*" -o $rtmcovfile
5. lcov -r $rtmcovfile "*/SS_MacPsWmp/*" -o $rtmcovfile
6. lcov -r $rtmcovfile "*/ssCommon/*" -o $rtmcovfile
7. lcov -r $rtmcovfile "*/ssData/*" -o $rtmcovfile
8. lcov -r $rtmcovfile "*/ssDcmPs/*" -o $rtmcovfile
9. lcov -r $rtmcovfile "*/ssPsCommon/*" -o $rtmcovfile
10. lcov -r $rtmcovfile "*/ssTestModel/*" -o $rtmcovfile
11. # - Remove unneeded paths from coverage
12. lcov -r $rtmcovfile "/build/ltesdkroot/*" -o $rtmcovfile
13. lcov -r $rtmcovfile "*/SC_DSP_Common/*" -o $rtmcovfile
14. lcov -r $rtmcovfile "*/C_Test/*" -o $rtmcovfile
15. lcov -r $rtmcovfile "*/T_Tools/*" -o $rtmcovfile
16. lcov -r $rtmcovfile "*/ENV/*" -o $rtmcovfile
17. lcov -r $rtmcovfile "*/I_Interface/*" -o $rtmcovfile
18. lcov -r $rtmcovfile "/usr/*" -o $rtmcovfile
19. lcov -r $rtmcovfile "/opt/*" -o $rtmcovfile
20.
21. mv $rtmcovfile $PROJECT_ROOT/C_Test/SC_MAC/MacLinuxRtm/logs
22. cd $PROJECT_ROOT/C_Test/SC_MAC/MacLinuxRtm/logs
23. genhtml -o tdd_ut_rtm_tests_coverage $rtmcovfile >/dev/null
测试结果概览
具体某个⽂件的覆盖率。

相关文档
最新文档