使用gcov,lcov,genhtml进行代码覆盖率测试

场景:mytest.cpp main.cpp mytest.h main调用mytest.cpp里的函数
step1: 编译,链接
           g++ -c mytest.cpp -ftest-coverage -fprofile-arcs -o mytest.o          --->> mytest.gcno mytest.o
           g++ -c main.cpp -ftest-coverage -fprofile-arcs -o main.o               --->> main.gcno main.o
           g++ -ftest-coverage -fprofile-arcs main.o mytest.o -lgcov -o main.exe  --->> main.exe
step2: 运行,生成gcda数据
           ./main.exe         --->>main.gcda  mytest.gcda
step3:生成覆盖率数据
           gcov -b main.cpp   --->> main.cpp.gcov                                   【实际需要gcno,gcda文件】
           gcov -b mytest.cpp  --->>mytest.cpp.gcov
           【备注】实际上到这里就可以看到覆盖率信息了,并且在调用gcov的时候已经会有部分信息如图
   step4:生成info数据,为生成html报表准备
            lcov -d ./ -o main.info -c                      【-c选项:capture覆盖率数据,请man lcov查看,需要.cpp, gnco,gcda三种数据或文件】
           
   step5:生成html报表
           genhtml -o ./result_dir main.info        【输入main.info,输出为result_dir下所有的html及其他文件】

参考信息
http://gcc.gnu.org/onlinedocs/gcc/Gcov.html#Gcov
http://gcc.gnu.org/onlinedocs/gcc-3.0/gcc_8.html

http://blog.csdn.net/lsj6730960/article/details/6161999

1. .gcda文件目录出错,找不到要创建的目录,这种主要用于跨平台情况。

这个是由于.gcda文件的生成默认保存到.o所在的目录,但是如果.o所在目录不存在,就会出现错误。

设置环境变量可以解决这个问题。

设置GCOV_PREFIX=/target/run 和 GCOV_PREFIX_STRIP=1

则生成的.gcda文件 将会保存到 /target/run/build/foo.gcda。

2. the gcov message “Merge mismatch for summaries”

可以将.gcda全部删除或者对整个文件全部编译,而不是单个改变的文件,这个是由于gcda与gcno不相配导致的,因为两者之间都有个时间戳用来记录是不是相同的。

3. 想改变gcda输出的路径,设置GCOV_PREFIX和GCOV_PREFIX_STRIP环境变量,如默认生成在

/data/hudson/slave/workspace/ABC-test/ABC_dev_branch/build64_debug/

如果设置如下

export GCOV_PREFIX=”/data/cloud_deploy_pkg/abc/”

export GCOV_PREFIX_STRIP=1

则对比生成路径,实际的路径已经改变,并被剥去$GCOV_PREFIX_STRIP级路径

                                   /data/hudson/slave/workspace/ABC-test/ABC_dev_branch/build64_debug/   原始路径

/data/cloud_deploy_pkg/abc/hudson/slave/workspace/ABC-test/ABC_dev_branch/build64_debug/   实际路径



------------------------------补充------------------------------

lcov -d ./ -c -o main.info -b ./ 
genhtml -o report_main/ main.info 

将重要的头文件gcov_out.h 加入到你的main文件中,这样就可以使用  kill -USR1 来刷新主程序,而不许要使main.exe退出就可以生成gcda数据

/****************************
@filename: gcov_out.h
@author: peterguo@tencent.com
@date: 2011.11.12
*****************************/
#ifndef __GCOV_OUT_H__
#define __GCOV_OUT_H__
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

extern "C" void sighandler(int signo)
{   
    extern void __gcov_flush();
    __gcov_flush();
}

extern "C" __attribute__ ((constructor)) void __ctor()
{   
    int sigs[] = { SIGUSR1 };
    int i;  
    struct sigaction sa;
    sa.sa_handler = sighandler;//定义信号处理函数,使用kill -USR1  $pid进行刷新
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_NODEFER;

    for (i = 0; i < sizeof (sigs)/ sizeof (sigs[0]); ++i)
    {       
        if (sigaction(sigs[i], &sa, NULL) == -1)
        {       
            perror("Could not set signal handler");
        }       
    }
}
#endif // end of __GCOV_OUT_H__


转载于:https://my.oschina.net/sanpeterguo/blog/207287

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要安装gcovlcov工具。然后,你可以按照以下步骤进行操作: 1. 在test.cpp文件所在的目录下创建一个名为"CMakeLists.txt"的文件。 2. 在"CMakeLists.txt"文件中,添加以下内容: ``` cmake_minimum_required(VERSION 3.10) project(Test) set(CMAKE_CXX_STANDARD 11) add_executable(test test.cpp) target_compile_options(test PRIVATE --coverage) target_link_libraries(test PRIVATE gcov) add_custom_target(coverage COMMAND ${CMAKE_COMMAND} -E environment "GCOV_PREFIX=./" "GCOV_PREFIX_STRIP=0" ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} gcov -b -c ${CMAKE_SOURCE_DIR}/test.cpp COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} lcov --capture --directory . --output-file coverage.info COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} lcov --remove coverage.info '/usr/*' "${CMAKE_BINARY_DIR}/*" --output-file coverage.info COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_BINARY_DIR} lcov --list coverage.info ) ``` 这个CMakeLists.txt定义了一个名为Test的项目,并将test.cpp编译为可执行文件test。编译选项--coverage允许生成代码覆盖信息。target_link_libraries指定链接gcov库。 add_custom_target添加一个名为“coverage”的自定义目标,该目标使用环境变量设置gcov生成代码覆盖信息。使用lcov收集覆盖信息,将其保存在coverage.info文件中,并且从输出中删除一些不必要的信息。 3. 在终端中进入test.cpp所在的目录,创建一个build目录。 ``` mkdir build && cd build ``` 4. 运行cmake命令。 ``` cmake .. ``` 5. 运行make命令,生成可执行文件test。 ``` make ``` 6. 运行test。 ``` ./test ``` 7. 运行覆盖率测试。 ``` make coverage ``` 执行这个命令将生成一个名为coverage.info的文件,其中包含了test.cpp文件的代码覆盖率信息。你可以使用lcovgenhtml工具生成HTML格式的报告。 ``` lcov --list coverage.info genhtml coverage.info --output-directory coverage-report ``` 打开coverage-report目录下的index.html文件,你就可以看到代码覆盖率报告了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值