使用 gcov,是否可以合并到 .gcda 文件?

发布于 2024-09-08 04:02:51 字数 274 浏览 9 评论 0原文

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

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

我用的是lcov。

Mac OS X 10.6、GCC 4.0

谢谢!

I have the same source files (C and Obj-C) being compiled into two targets: the unit test executable and the actual product (which then gets integration tested). The two targets build into different places, so the object files, .gcno and .gcda files are separate. Not all source files are compiled into the unit test, so not all objects will exist there. All source files are compiled into the product build.

Is there a way to combine the two sets of .gcda files to get the total coverage for unit tests and integration tests (as they are run on the product build)?

I'm using lcov.

Mac OS X 10.6, GCC 4.0

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

偏闹i 2024-09-15 04:02:51

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

基本上我所做的如下:

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

我希望这对某人有帮助。

Finally I managed to solve my problem by means of lcov.

Basically what I did is the following:

  • Compile the application with the flags -fprofile-arcs -ftest-coverage --coverage
  • Distribute the copy of the application to each node.
  • Execute the application in each node in parallel. (This step generates into the application directory in the access host the coverage information)
  • Let lcov make his work:
    • lcov --directory src/ --capture --output-file coverage_reports/app.info
  • Generate the html output:
    • genhtml -o coverage_reports/ coverage_reports/app.info

I hope this can be of help to someone.

无名指的心愿 2024-09-15 04:02:51

由于您使用的是 lcov,因此您应该能够将 gcov .gcda 文件转换为 lcov 文件并将它们与 lcov --add-tracefile 合并。

来自手册页添加跟踪文件的内容。
使用 -a 开关指定多个跟踪文件,通过添加匹配测试和文件名组合的执行计数来组合这些文件中包含的覆盖率数据。

Since you're using lcov, you should be able to convert the gcov .gcda files into lcov files and merge them with lcov --add-tracefile.

From manpage: Add contents of tracefile.
Specify several tracefiles using the -a switch to combine the coverage data contained in these files by adding up execution counts for matching test and filename combinations.

地狱即天堂 2024-09-15 04:02:51

请参阅下面的更新。

我认为执行此操作的预期方法不是直接组合 .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

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

更新:我发现实际上可以使用 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 的迂回方式,在合并许多集合时,lcov 的速度要慢得多。在我的机器上,合并约 80 组 70 个文件只需不到 0.5 秒。您仍然可以在聚合集上执行 lcov,如果您需要的话,这也会快得多。我使用 Emacs cov-mode ,它直接使用 .gcov 文件。

有关详细信息,请参阅此答案

See UPDATE below.

I think the intended way to do this is not to combine the .gcda files directly but to create independent coverage data files using

lcov -o unittests.coverage -c -d unittests
lcov -o integrationtests.coverage -c -d integrationtests

Each coverage data then represents one "run". You can of course create separate graphs or html views. But you can also combine the data using --add-tracefile, -a for short

lcov -o total.coverage -a unittests.coverage -a integrationtests.coverage

From the total.coverage you can generate the total report, using genhtml for example.

UPDATE: I found that it is actually possible to merge .gcda files directly using gcov-tool, which unfortunately are not easily available on the Mac, so this update doesn't answer the original question.

But with gcov-tool you can even incrementally merge many set together into one:

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

Although that is not documented and might be risky to rely on.

This is really fast and avoids the round-about way over lcov, which is much slower when merging many sets. Merging some 80 sets of 70 files takes under .5 second on my machine. And you can still do an lcov on the aggregated set, which also is very much faster, should you need it. I use Emacs cov-mode which uses the .gcov files directly.

See this answer for details.

暮凉 2024-09-15 04:02:51

我通过 lcov multi -d 参数合并它,如下所示。有用。

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

I merge it by lcov multi -d parameters as below. It works.

lcov -c -d ./tmp/ -d ./tmp1/ -o ./tmp/coverage.info
旧时浪漫 2024-09-15 04:02:51

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

A simpler alternative would be to compile shared C/ObjC files once (generating .o files or better yet, single .a static library) and later linked into each test. In that case gcov will automatically merge results into single .gcno/.gcda pair (beware that tests have to be run serially, to avoid races when accessing gcov files).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文