最近想统计一个c++的server 的http接口的对代码的覆盖率情况,但之前做的覆盖率统计都是Unittest的覆盖率,而且一般都是统计非daemon程序的,查了一下,daemon也可以使用gcov+lcov来生成覆盖率信息,简单记录了一下;
damon进程与可执行进程不同的地方是需要注册一个gcov_flush的触发条件,一般通过注册信号量的方式实现,例子是ctrl+C时触发__gcov_flush;
extern "C" void __gcov_flush();void cs(int n){ signal(SIGINT, cs);if(n==SIGINT){__gcov_flush();std::cout<<"\n你按下了ctrl+c"<<std::endl;}}
然后在main函数的开始处注册;
void cs(int n);std::cout<<"ab"<<std::endl;signal(SIGINT, cs);
在MakeFile里的编译选项设置处增加参数:-lgcov -fprofile-arcs -ftest-coverage; set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} -lgcov -fprofile-arcs -ftest-coverage”)
cmake -DCMAKE_BUILD_TYPE=Debug make 会在CMakeFiles里产生相关工程的.gcno和.o文件
运行程序,后执行接口测试case,按下CTRL+C 触发gcov_flush方法,生成.gcda文件; 当然要做成自动化触发的话可以在执行完接口测试case后,使用kill -SIGINT [pid] 来给进程一个ctrl+C的信号量
使用lcov工具生成,可以yum安装; lcov –directory . –capture –output-file demo.info
使用genhtml工具通过覆盖率文件生成展示页面 使用genhtml –o result demo.info 会生成名为result的文件夹,文件夹内包含index.html,可打开查看具体覆盖率统计
点击函数名,可查看具体函数及行覆盖情况