简介:
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文件,加工可得覆盖率.