c++测试覆盖率统计
对于c/c++程序,使用GCC自带的gcov可以统计代码测试覆盖率。
1,编译时加上选项
-fprofile-arcs -ftest-coverage
如果用cmake
add_definitions (-fprofile-arcs -ftest-coverage) target_link_libraries (live -fprofile-arcs)
2,将编译后产生的.gcno文件备份
3,运行程序
export GCOV_PREFIX=/opt/v_system/live_gcov/coverage/ export GCOV_PREFIX_STRIP=999 LD_PRELOAD=./gcov_out.so ./bin/live -f etc/ops.conf
4,生成报告
程序退出后会在上面配置的/opt/v_system/live_gcov/coverage/目录下生成.gcda文件, 将第2步的.gcno文件和.gcda放在一个目录下,执行
lcov -c -d /opt/v_system/live_gcov/coverage/ -o res.info genhtml -o report res.info
5,查看报告
在report目录下生成index.html,用浏览器打开。
gcov_out.so源码
代码编译:gcc -shared -fPIC gcov_out.c -o gcov_out.so
#include <stdio.h> #include <stdlib.h> #include <signal.h> #define SIMPLE_WAY void sighandler(int signo) { #ifdef SIMPLE_WAY exit(signo); #else extern void __gcov_flush(); // flush out gcov stats data __gcov_flush(); // raise the signal again to crash process raise(signo); #endif } __attribute__ ((constructor)) void ctor() { int sigs[] = { SIGILL, SIGFPE, SIGABRT, SIGBUS, SIGSEGV, SIGHUP, SIGINT, SIGQUIT, SIGTERM }; int i; struct sigaction sa; sa.sa_handler = sighandler; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESETHAND; for(i = 0; i < sizeof(sigs)/sizeof(sigs[0]); ++i) { if (sigaction(sigs[i], &sa, NULL) == -1) { perror("Could not set signal handler"); } } }