为lcov生成分支覆盖数据

23

我正在尝试使用 lcov 进行代码覆盖度度量,但是我无法使分支覆盖率工作。

这是我的使用方式:

g++ -ggdb3 --coverage src/read.c tests/test.cpp -o bin/test 
lcov --zerocounters --directory $PWD 
lcov --capture --initial --directory $PWD --output-file coverage_output  
./bin/test 
lcov --no-checksum --directory $PWD --capture --output-file coverage_output 
genhtml --branch-coverage --highlight --legend --output-directory out coverage_output

但我得到了:

总体覆盖率:
行......:100.0%(60/60行)
函数......:100.0%(26/26个函数)
分支......:未发现数据

有什么想法吗?

4个回答

41

最新版本的 LCOV 默认关闭分支覆盖率。

您需要通过以下方式重新启用它:

  • 编辑您的 ~/.lcovrc 文件(从 /etc/lcovrc 复制),将 lcov_branch_coverage 设置更改为 1
  • 在 lcov 命令行中添加 --rc lcov_branch_coverage=1

8
正如Abhay Joshi所说:请记得在每个lcov调用中都添加--rc行,否则将会丢失分支统计信息。另外,genhtml选项是--rc genhtml_branch_coverage=1。 - garph0
2
你是否碰巧知道那个变更的理由?直觉上感觉这很不对。 - Griwes
分支数据的收集在2012年被禁用(即lcov版本1.11)。该更改说明启用此功能时可能会有一些性能影响(https://github.com/linux-test-project/lcov/commit/263de2b40e21193ef8d11e899eb55aa52b17225d)。这些影响的显著程度取决于程序的大小。通常情况下,这不应该是一个问题。 - maxschlepzig
2
如果您喜欢使用 lcov -l file.info 以输出基于文本的汇总信息,则 --rc lcov... 参数将无法正常工作。因此,编辑 .locvrc 文件似乎是更好的选择。 - eDeviser

14

.lcovrc文件是需要放置在lcov文件路径下的设置文件。老实说,我没有研究过这个文件的使用。

你需要为所有调用的lcov添加额外的参数“--rc lcov_branch_coverage=1”。对于你的情况,将此参数添加到你的三个调用中。如果你错过了其中一个,它将会减少分支覆盖率。

同时,genhtml也需要使用--branch-coverage参数。


不幸的是,我看到“geninfo: 注意: --initial 不会生成分支覆盖数据”,因此其中至少有一个不会使用分支覆盖运行。 - Evgen
1
对于genhtml,我发现参数是--rc genhtml_branch_coverage=1而不是--branch-coverage - Rick Wildes
@Abhay Joshi:这就是关键。每次调用lcov时,都必须使用附加参数。即使您只想从报告中删除std包含文件。 - tangoal
今天所有的调用都救了我的命! - GeekLee

0

根据这个帖子,差异可能取决于您使用的gcc版本。您能分享一下您使用的版本吗? 我无法获得以下分支覆盖率:

 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

这是另一个问题:版本字符串似乎表明使用的是苹果的LLVM clang版本,而不是GCC。而且LLVM已知生成覆盖数据的旧格式版本通常与LCOV所期望的不兼容。 - maxschlepzig

0

抱歉,这不是一个“想法”,而是确认您正在正确地执行所有操作。您的确切命令在这个简单的代码上起作用:

#include <iostream>
using namespace std;

bool foo(int i)
{
    if (i != 0) {
        return 12 / i;
    } else {
        return 0;
    }
}

int main(int argc, char** argv)
{
    cout << foo(argc) << endl;
    return 0;
}

lcov覆盖率表包含行、函数和分支的统计信息。也许要仔细检查一下您是否实际上正在查看正确的输出HTML?


嗨Tom,你的例子对我也不起作用。命令输出显示“branches...: no data found”,所以我认为我在HTML中没有漏掉什么。但是,谢谢!如果你能使用我的命令看到分支数据,那么可能是安装问题或工具方面的问题。 - Hugo
你可能使用的是旧版 LCOV(<1.11),其中分支数据收集默认启用。 - maxschlepzig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接