C/C++代码覆盖率工具gcovlcov

Posted 笑侃码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++代码覆盖率工具gcovlcov相关的知识,希望对你有一定的参考价值。

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_test.info’ -b . -c

指定lcov在当前目录“.”去找代码覆盖的信息,输出为’hello_test.info’ ,这个hello_test.info是一个中间结果,需要把它用genhtml来处理一下,genhtml是lcov里面的一个工具。

genhtml -o result hello_test.info

指定输出目录是 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

 

 

测试结果概览

具体某个文件的覆盖率

以上是关于C/C++代码覆盖率工具gcovlcov的主要内容,如果未能解决你的问题,请参考以下文章

使用 gcov/lcov/gcovr 在 Android APK 下获取代码覆盖率

测试工具-代码扫描Sonar

使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率

使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率

代码质量看护的一些工具记录

C++非原创|统计代码覆盖率