【问题标题】:Ignore or exclude code in external libraries with gcov使用 gcov 忽略或排除外部库中的代码
【发布时间】:2023-04-06 01:28:01
【问题描述】:

我正在开发一个使用几个 boost 库的项目。在查看我们的测试报告时,我们发现测试覆盖率信息有时确实适合我们的源代码。我能够追踪到 boost::range。我认为这是因为库中的一些静态初始化,虽然我不能说更具体的。

基本上,如果您使用gcc --coverage 编译以下代码,运行它并使用gcov -b 打印覆盖率报告,将会有四个额外的分支和一个额外的行,我想忽略它们。

#include <boost/range.hpp>

int foo(int x)
{
    return x+1;
}

int main(int argc, char* argv[])
{
    return foo(argc);
}

覆盖率报告是: 执行的行数:100.00% of 5 执行的分支:100.00% of 4 至少服用一次:50.00% of 4 执行的调用:100.00% of 2 创建'test_gcov.cpp.gcov'

我猜 5 行的计数来自 boost::range 库中的两个函数签名、函数体和另外一行。我不知道具体在哪里,但是生成的 gcov 文件显示正在进行一些静态初始化,所以我猜那是分支所在的位置。

我想知道是否有办法告诉 gcov 忽略 boost 命名空间中的任何代码,或任何其他方式。

【问题讨论】:

  • 您是否能够为您的问题找到答案?我正在解决一个类似的问题,任何提示将不胜感激。 :)
  • @Petr 抱歉,我没能很快找到原因,然后不得不转向其他问题。

标签: c++ gcov boost-range


【解决方案1】:

您可以使用--remove-r 标志来忽略来自外部库的文件。例如:

lcov -c -d <build_dir> -o <output_trace_file>
lcov -r <output_trace_file> "/usr*" -o <output_trace_file>

您可以将"/usr*" 替换为您要删除的任何模式。

blog post here 给出了如何使用该标志的一个很好的例子(并涵盖了整个 lcov 过程,从头到尾。)

【讨论】:

    最近更新 更多