c++测试覆盖率统计

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");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值