简介:
Gcov是源代码覆盖率分析和语句分析工具
Gcov生成程序中每条语句执行次数的精确计数
Gcov是作为GNU编译器集合(GCC)套件的标准程序
选项-fprofile-arcs -ftest-coverage用于编译程序进行覆盖率分析(第一个选项用于记录分支统计信息, 第二个选项用于保存行执行计数)
功能:
统计每行代码的执行频率
统计实际执行代码行 统计代码执行效率,需要配合profiling tool,如perf, gprof
结合lcov生成可视的图形化的覆盖率报告
lcov: 由一组构建与基于文本的Gcov输出之上的perl脚本构成, 实现代码覆盖率文件html格式的输出
注意:
由于Gcov按行积累统计数据,它适合每行只有一条程序语句的编程风格,如果使用了宏,并且宏的行为类似于函数,那么统计数据就没有那么有用了
Gcov只在使用GCC编译的代码上工作
工作流程:
- 编译前,加入编译参数,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)
- 使用CMake生成makefile时指定
USE_GCOVE:
cmake -DUSE_GCOV=1
- 编译完成后生成
.gcno文件, 而.gcda文件必须执行生成的二进制才会生成.两个文件的目录通常在二进制目录下,如果是CMake,在build/CMakeFile/binary-name/
- 不kill进程生成
.gcda文件
不杀进程生成.gcda文件
- 安装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 dir final.info // (dir是输出目录)
注:
-c: 获取覆盖率信息
-d: gcda和gcno目录
-o: 输出文件
原理:
源码经过编译预处理,生成汇编文件, 在生成汇编文件的同时完成插桩, 直接插入生成的*.s文件中
汇编文件汇编生成目标文件, 生成可执行文件, 并且生成
.gcno文件
执行二进制文件,在运行过程中插入的桩点负责统计执行信息. 生成
.gcda文件, 加工得到代码覆盖率统计