使用 gcov 忽略或排除外部库中的代码
Ignore or exclude code in external libraries with gcov
我正在从事一个使用几个 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);
}
覆盖率报告是:
行 executed:100.00%,共 5 行
分行 executed:100.00% of 4
至少 once:50.00% 的 4
调用 executed:100.00% of 2
创建 'test_gcov.cpp.gcov'
我猜 5 行的计数来自两个函数签名、函数体和 boost::range 库中的另外一行。我不知道具体在哪里,但是生成的 gcov 文件显示正在进行一些静态初始化,所以我猜这就是分支所在的位置。
我想知道是否有办法告诉 gcov 忽略 boost 命名空间中的任何代码,或任何其他方式。
您可以使用 --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
过程,从头到尾。)
我正在从事一个使用几个 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);
}
覆盖率报告是: 行 executed:100.00%,共 5 行 分行 executed:100.00% of 4 至少 once:50.00% 的 4 调用 executed:100.00% of 2 创建 'test_gcov.cpp.gcov'
我猜 5 行的计数来自两个函数签名、函数体和 boost::range 库中的另外一行。我不知道具体在哪里,但是生成的 gcov 文件显示正在进行一些静态初始化,所以我猜这就是分支所在的位置。
我想知道是否有办法告诉 gcov 忽略 boost 命名空间中的任何代码,或任何其他方式。
您可以使用 --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
过程,从头到尾。)