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");
}
}
}
GCC自动生成代码覆盖率报告
本文介绍了如何使用GCC和相关工具来统计C/C++程序的代码覆盖率,包括编译选项设置、运行流程、生成报告的方法及解读报告内容。
3048

被折叠的 条评论
为什么被折叠?



