有没有一种方法可以将两个.gcda文件合并成一个?

10

我有一个应用程序的几个单元测试,每个测试都能够生成.gcda文件。我希望能够生成统一的.gcda文件来表示我的测试套件的覆盖范围。似乎没有简单的方法可以做到这一点,但我可能是错的,所以我想问一下。

在gcov中,是否可以合并两个.gcda文件?之前已经有人问过了,解决方案是将其转换为lcov .info文件,然后使用该方式进行合并。如果可能的话,我希望合并操作的输出仍然是一个单独的.gcda文件,这样我就不必使用lcov。

3个回答

4
有一段代码可以合并.gcda文件,但不幸的是它被埋在libgcov.a中,而这个库是作为gcc的一部分进行构建的。如果您退出(或以任何方式调用带覆盖率编译的程序中的__gcov_flush()),它实际上会检测到预先存在的.gcda文件,加载它们,将它们的数据与正在运行的程序的数据聚合,并将其保存回来。我不知道是否有任何工具可以在命令行提供该功能。即使使用了libgcov.a,您可能也没有可用的钩子来完成您想要的操作,而必须从gcc-core发行版中获取源代码并进行修改。
过去我所做的就是将所有数据提取到注释源代码(.gcov)中并在该级别上进行聚合。.gcda格式能够存储比行覆盖信息更多的信息(例如分支计数),而libgcov.a聚合则知道如何组合这些信息(对于某些信息而言,这并不像简单的求和那样简单)。

2

Gcov包带有gcov-tool可执行文件,可以合并gcda文件:

gcov-tool merge dir1 dir2

在dirN内,.gcda文件的位置必须相同。生成的.gcda文件将存储在merged_profile目录中(可以使用-o标志进行覆盖)。

Gcov-tool主要用于与使用GCOV_PREFIX-fprofile-dir=XXX.%p生成的一系列.gcda文件一起使用。

Gcov-tool一次只能合并两个配置文件,但您可以使用包装器gcov-tool-many来规避这个问题。


谢谢指针!“位置必须相同”是什么意思?如果我恰好有一个目录结构,其中.gcda分布在其中,它期望具有相同名称的文件位于该树中的相同位置? - thoni56
1
@thoni56 是的,确切地说:具有相同名称的文件必须位于合并目录内的相同相对位置。 - yugr
2
这并没有记录,所以依赖它可能存在风险,但似乎可以将新的集合逐步合并到原始集合中,例如 gcov-tool merge dir1 dir -o dir ; gcov-tool merge dir2 dir -o dir; gcov-tool merge dir3 dir -o dir,这样可以简化操作。(这并不是要贬低 gcov-tool-many 的优点)。 - thoni56
@thoni56 很棒! - yugr

1

我刚刚创建了一个测试项目,它显示出当单个测试应用程序连续使用不同参数运行时,gcda文件在运行之间得到更新,并且运行一次gcov(我使用gcovr.py)会产生聚合覆盖信息。


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