简介:

gcov集成在gcc中,如果安装了gcc不需要单独安装gcov.

功能:

统计每行代码的执行频率
统计实际执行代码行
统计代码执行效率,需要配合profiling tool,如perf, gprof
结合lcov生成可视的图形化的覆盖率报告
lcov: 由一组构建与基于文本的gcov输出之上的perl脚本构成,实现HTML的输出

注意:

由于gcov按行积累统计数据,它适合每行只有一条程序语句的编程风格,如果使用了宏,并且宏的行为类似于函数,那么统计数据就没有那么有用了.
gcov只在使用gcc编译的代码上工作.

工作流程:

1. 编译前,加入编译参数,CMake组织的工程下:

if(USE_GCOV)
message(STATUS "using gcov")
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") --> 可以写为target_link_libraries(binary-name gcov)
endif(USE_GCOV)复制代码

2. 使用cmake生成makefile时指定USE_GCOVE:

cmake -DUSE_GCOV=1复制代码

3. .gcno文件在编译后就会出现,.gcda文件必须执行编译生成的二进制才会生成.两个文件的目录通常在二进制目录下,如果是cmake,在build/CMakeFile/binary-name/

4. 不kill进程生成.gcda文件

见另外一篇文章

5.安装lcov

可以yum安装或者github上的安装流程
产生覆盖率文件:

lcov -c -d . -o cover.info复制代码

合并文件

lcov -a x.info -a y.info -o total.info复制代码

过滤信息

lcov --remove total.info '/src/include/*' '/usr/bin/*' -o final.info (屏蔽include和bin目录的覆盖率信息)复制代码

生成html文件

genhtml -o cover_report final.info (cover_report是一个目录)复制代码

注:
-c: 获取覆盖率信息
-d: gcda和gcno目录
-o: 输出文件

原理:

源码经过编译预处理,生成汇编文件,在生成汇编文件的同时完成插桩,直接插入生成的*.s文件中,最后汇编文件汇编生成目标文件,生成可执行文件,并且生成.gcno文件.
执行二进制文件,在运行过程中插入的桩点负责统计执行信息.
生成gcda文件,加工可得覆盖率.