以前做过一些gcov方面的工作,最近又做,发现一些踩过的坑被忘记了,又整理了一遍,防止再次出现类似情况。

使用gcov测试代码覆盖率的流程是:
添加编译选项和链接选项-----》运行程序(设置GCOV_PREFIX,设置GCOV_PREFIX_STRIP环境变量)-----》让程序正常结束(kill不会生成相关.gcda文件)-----》运行gcov命令手动分析或用lcov来分析,lcov可能需要手动安装,安装地址https://github.com/linux-test-project/lcov.git

1,在编译选项中添加-ftest-coverage -fprofile-arcs,
-fkeep-static-functions -fkeep-inline-functions选项可另行选用
在链接选项中添加 -lgcov,特别要注意,编译生成的.so中,也要链接-lgcov,
即在生成的可执行程序和.so中,都需要链接-lgcov

2,运行程序,先设置GCOV_PREFIX和GCOV_PREFIX_STRIP环境变量,也可以不设置,不设置时,生成的.gcda文件在make时的目录及其子目录下,即与相关的源代码路径相同,只是文件名不同。
这两个变量,可以控制生成的.gcda的位置
GCOV_PREFIX_STRIP去掉原代码路径中的前几级,
比如源代码路径为/a/b/c/d.cpp,如果GCOV_PREFIX_STRIP=2
则实际使用的路径是c/d.cpp
如果GCOV_PREFIX=/run/gcov,则.gcda实际存放的路径是/run/gcov/c/d.gcda

程序运行后,可以进行正常的业务测试

3,让程序正常结束,比如处理特定信号并exit(0),或其他方式,把程序kill掉不会生成相关的.gcda

4,gcov命令分析见 gcov -h,下面附一个lcov的小脚本:

#!/bin/sh

#如果lcov没有装,要先装lcov
#可以从 https://github.com/linux-test-project/lcov.git 上装
#使用前注意事项
#1,启用gcov相关编译选项,见make gcov=1
#2,需要在程序运行并正常退出后,运行此脚本,生成相关覆盖率文件

echo "check lcov cmd"
lcov=$(command -v lcov | wc -l)
if [[ ${lcov} == 0 ]]; then
    echo 请先安装 lcov, 安装来源可以参考 https://github.com/linux-test-project/lcov.git
    exit 0
fi

echo "creating ../gcov"
if [[! -d ../gcov ]]; then
    mddir ../gcov
fi

echo "creating ../gcov/gcov.info"
lcov -c -o ../gcov/gcov.info -d ../src

echo "creating htmls "
if [[! -d ../gcov/html ]]; then
    mddir ../gcov/html
fi

genhtml -o ../gcov/html ../gcov/gcov.info