当我使用clang编译代码时,gcov会抛出内存不足错误。

5

我正在尝试建立一个基本项目,并希望使用gcov。当我使用g++时,它可以工作:

g++ main.cpp whatever.cpp -fprofile-arcs -ftest-coverage

gcov的输出是正常的。
gcov main.gcno 
main.gcda:cannot open data file, assuming not executed
File 'main.cpp'
Lines executed:0.00% of 20
Creating 'main.cpp.gcov'

File '/usr/include/c++/7/iostream'
Lines executed:0.00% of 1
Creating 'iostream.gcov'

然而,我需要使用clang。运行编译命令后:
clang++-6.0 main.cpp whatever.cpp -fprofile-arcs -ftest-coverage

我遇到了以下错误:
main.gcno:version '402*', prefer 'A73*'

gcov: out of memory allocating 16158246392 bytes after a total of 0 bytes

我的gcov版本是7.3.0,与gcc和g++相同。

有什么问题,我该怎么办?

谢谢!


1
你是不是想说 llvm-cov?Clang 有自己的覆盖源代码插桩方法,目前我不知道它是否与 gcov 兼容。 - AmeyaVS
2个回答

11

在尝试使用lcov生成HTML报告和gcovr生成XML报告时,我遇到了类似的版本不匹配问题。

lcov

我添加了参数--gcov-tool gcov_for_clang.sh

gcovr

我添加了参数--gcov-executable gcov_for_clang.sh

gcov_for_clang.sh

包含:

#!/bin/bash
exec llvm-cov-6.0 gcov "$@"

原因: lcov--gcov-tool 无法处理 llvm-cov-6.0gcov 之间的空格,因此需要使用 bash 脚本间接执行。别忘了将文件设置为可执行!

回到你的问题

我想你只需要将 gcov main.gcno 替换为 llvm-cov-6.0 gcov main.gcno。这并不使用 LLVM 的真正的基于源代码的覆盖率功能,而是使用它的 与 gcov 兼容的覆盖率实现

关于编译器选项的注意事项

在我的设置中,我只需将 --coverage 作为编译器选项传递,这应该足够了。


0

这里提供了从Clang和相关工具获取基于源代码的覆盖率报告的参考。

更新: 如@Lothar在评论中指出,上述链接现在指向由Clang Tooling支持的基于源代码的代码覆盖率,gcov兼容示例部分已被删除。

对于兼容gcov的文档,可以在这里查看llvm-cov gcov命令行调用。


2
这个曾经指向一个有效的Clang手册版本,但现在在Clang 12中它只包含了新的sanitizer覆盖率描述“-fprofile-instr-generate”,而不再包括gcov格式。 - Lothar
感谢您的提示,@Lothar,已经更新了答案指向 llvm-cov gcov 文档。但另一个回答可能更相关。 - AmeyaVS

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