使用gcov,是否可以合并两个.gcds文件?

15

我有相同的源文件(C和Obj-C)编译成两个目标:单元测试可执行文件和实际产品(然后进行集成测试)。 两个目标构建到不同的位置,因此对象文件、.gcno和.gcda文件是分开的。 并非所有源文件都编译到单元测试中,因此并非所有对象都存在于其中。 所有源文件都编译到产品构建中。

有没有一种方法可以结合两组.gcda文件,以获得单元测试和集成测试的总覆盖率(因为它们在产品构建上运行)?

我正在使用lcov。

Mac OS X 10.6,GCC 4.0

谢谢!

5个回答

10

最后,我通过lcov解决了我的问题。

基本上我所做的是以下步骤:

  • 使用标志-fprofile-arcs -ftest-coverage --coverage编译应用程序
  • 将应用程序的副本分发到每个节点。
  • 在每个节点上并行执行应用程序。(此步骤将覆盖信息生成到访问主机中的应用程序目录中)
  • 让lcov完成他的工作:
    • lcov --directory src/ --capture --output-file coverage_reports/app.info
  • 生成HTML输出:
    • genhtml -o coverage_reports/ coverage_reports/app.info

希望这对某些人有所帮助。


哇,谢谢你的回复。在我提出这个问题和现在之间,我已经有了两份非常不同的工作。我希望这能帮助到某些人。 - Joe
1
--coverage 在编译时等同于 -fprofile-arcs -ftest-coverage,在链接时等同于 -lgcov,因此同时使用所有这些选项是冗余的。 - Bulletmagnet
我不明白这应该如何工作。这是否意味着当两个进程尝试写入同一个gcda文件时,gcov会锁定文件?能否确认一下这一点? - undefined

8
由于您正在使用lcov,因此您应该能够将gcov .gcda文件转换为lcov文件,并使用lcov --add-tracefile将它们合并。
引用自manpage:“添加跟踪文件的内容。使用-a开关指定多个跟踪文件,通过为匹配的测试和文件名组合添加执行计数来组合这些文件中包含的覆盖数据。”

2
请看下面的更新。
我认为实现这个的正确方法不是直接合并.gcda文件,而是使用独立的覆盖数据文件。
lcov -o unittests.coverage -c -d unittests
lcov -o integrationtests.coverage -c -d integrationtests

每个覆盖数据都代表一个“运行”。“您当然可以创建单独的图形或HTML视图。但是,您也可以使用--add-tracefile(简写为-a)组合数据。”
lcov -o total.coverage -a unittests.coverage -a integrationtests.coverage

通过使用例如genhtml,您可以从total.coverage生成总报告。

更新:我发现实际上可以直接使用gcov-tool合并.gcda文件,但不幸的是这些工具在Mac上不易获得,因此此更新无法回答原始问题。

但是使用gcov-tool,您甚至可以将许多集合逐步合并成一个:

gcov-tool merge dir1 dir -o dir
gcov-tool merge dir2 dir -o dir
gcov-tool merge dir3 dir -o dir

尽管这并没有得到官方文档的支持,而且可能存在风险,但这样做非常快速,避免了使用lcov的繁琐方式,当合并多个集合时,后者速度更慢。在我的电脑上,合并了大约80个包含70个文件的集合只需要不到0.5秒。如果需要,您仍然可以对聚合集进行lcov操作,这也非常快速。我使用Emacs cov-mode直接使用.gcov文件。有关详细信息,请参见此答案

1

我使用以下的lcov多-d参数合并它。它有效。

lcov -c -d ./tmp/ -d ./tmp1/ -o ./tmp/coverage.info

这正是我一直在寻找的。无需创建中间的.info文件,只需汇总所有的gcda文件即可。我为每个测试创建单独的gcda文件,以便能够并行运行它们(例如使用“make -j test”命令)。 - thoni56

0
一个更简单的方法是将共享的C/ObjC文件编译一次(生成.o文件或者更好的是,单个.a静态库),然后链接到每个测试中。在这种情况下,gcov会自动合并结果到单个.gcno/.gcda对中(注意测试必须按顺序运行,以避免访问gcov文件时出现竞争)。

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