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

Ser*_*scu 5 c++ clang gcov clang++

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

g++ main.cpp whatever.cpp -fprofile-arcs -ftest-coverage
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

但是,我需要使用 clang。运行编译命令后:

clang++-6.0 main.cpp whatever.cpp -fprofile-arcs -ftest-coverage
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

main.gcno:version '402*', prefer 'A73*'

gcov: out of memory allocating 16158246392 bytes after a total of 0 bytes
Run Code Online (Sandbox Code Playgroud)

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

知道出了什么问题以及我能做些什么吗?

谢谢!

Rol*_*zin 11

当我尝试生成 html 报告lcov和 xml 报告时,我遇到了类似的版本不匹配问题gcovr。

左旋病毒

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

总冠状病毒

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

gcov_for_clang.sh

包含:

#!/bin/bash
exec llvm-cov-6.0 gcov "$@"
Run Code Online (Sandbox Code Playgroud)

基本原理:lcov无法处理和--gcov-tool之间的空格,因此 bash 脚本是间接的。不要忘记使文件可执行!llvm-cov-6.0gcov

回到你的问题

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

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

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


Ame*_*aVS 0

以下是从 Clang 和相关实用程序获取基于源代码的代码覆盖率报告的参考。

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

对于gcov兼容的文档,可以参考此处的llvm-cov gcov命令行调用。

  • 这曾经指向 Clang 手册的有效版本,但现在在 CLang 12 中,它仅包含新消毒剂覆盖范围“-fprofile-instr-generate”的描述,不再包含 gcov 格式。 (2认同)