c++测试覆盖率统计 —lcov

本文介绍了如何使用GCC和相关工具来统计C/C++程序的代码覆盖率,包括编译选项设置、运行流程、生成报告的方法及解读报告内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

    余额充值