是否可以使用 gcov 测量功能覆盖率?

Posted

技术标签:

【中文标题】是否可以使用 gcov 测量功能覆盖率?【英文标题】:Is it possible to measure function coverage with gcov? 【发布时间】:2010-10-06 18:13:53 【问题描述】:

目前,我们将 gcov 与我们的 Linux C++ 应用程序测试套件一起使用,它在测量线路覆盖率方面做得很好。

gcov 除了线路覆盖率之外,还能生成函数/方法覆盖率报告吗?

查看 gcov 接受的参数,我认为这是不可能的,但我可能会遗漏一些东西。或者,可能有没有其他工具可以根据 gcc 生成的统计数据生成函数/方法覆盖率报告?

更新:函数/方法覆盖率是指在测试期间执行的函数的百分比。

【问题讨论】:

【参考方案1】:

我猜你的意思是 -f 选项,它会给你每个函数覆盖的行的百分比。 Dr. Dobb's 上有一篇关于 gcov 的有趣文章,可能会有所帮助。如果“man gcov”没有显示 -f 标志,请检查您是否有 gcc 套件的最新版本。

编辑: 要获得未执行的函数的百分比,您可以简单地通过函数覆盖率输出进行解析,因为 0.00% 的覆盖率应该几乎等同于未调用。这个小脚本打印未执行的函数的百分比:

#!/bin/bash

if test -z "$1"
then
    echo "First argument must be function coverage file"
else
    notExecuted=`cat $1 | grep "^0.00%" | wc -l`
    executed=`cat $1 | grep -v "^0.00%" | wc -l`

    percentage=$(echo "scale=2; $notExecuted / ($notExecuted + $executed) * 100" |bc)

    echo $percentage
fi

【讨论】:

-f 选项并不是我想要的。它按功能提供线路覆盖,但我想要功能/方法覆盖。我对问题进行了澄清。 文章已“消失”,正确的链接是“drdobbs.com/code-coverage-for-c-unit-tests/…”,但文章未显示。 DDJ 死了。这是一篇较新的文章:medium.com/@naveen.maltesh/…【参考方案2】:

我们已经开始同时使用 gcov 和lcov。 lcov 的结果确实包括为您正在查看的“模块”执行的函数的百分比。

编辑: 模块 可以从目录到文件。

我还想补充一点,如果您已经在使用 GNU 编译器工具,那么 gcov/lcov 对您来说运行起来不会太难,并且它产生的结果非常令人印象深刻。

【讨论】:

【参考方案3】:

lcov 实用程序很好,我们使用它。但我不确定您是否需要它来满足您的需求。

我们

    使用 ctags (wikipedia;sourceforge) 查找相关头文件中声明的所有函数。

    运行 GCOV 以获取二进制文件中每个函数的行覆盖率。

    比较 1 和 2 中的函数列表以生成“调用的函数”/“可用的函数”。

我们将其称为“API 覆盖率”,因为我们仅将第 1 步应用于公共 API 标头。但是您可以根据自己的选择对所有标题或仅在子集上执行此操作。我认为我们以这种方式产生的比率就是您要寻找的比率。

【讨论】:

以上是关于是否可以使用 gcov 测量功能覆盖率?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将来自两个可执行文件的覆盖率数据与 gcov/gcovr 合并?

为仅标头库获取有用的 GCov 结果

gcov 报告的析构函数中的分支是啥?

Xcode 7 生成 GCOV

可以让 gcc/gcov 将覆盖率统计信息输出到源文件夹以外的位置吗?

代码覆盖率未显示使用 Xcode + gcov 的结果