使用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);
}

覆盖报告如下:执行的行数:5的100.00%执行的分支数:4的100.00%至少服用一次:50.00%/4执行的调用数:2的100.00%创建"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*"

这里的博客文章给出了如何使用该标志的一个很好的例子(并涵盖了整个lcov过程,从开始到结束)

最新更新