【问题标题】:When I compile my code with clang, gcov throws out of memory error当我用 clang 编译我的代码时,gcov 抛出内存不足错误
【发布时间】:2019-10-09 01:23:16
【问题描述】:

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

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

gcov的输出是OK的:

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++一样。

知道什么是错的,我能做些什么吗?

谢谢!

【问题讨论】:

  • 您的意思是llvm-cov? Clang有自己的覆盖源代码检测方法,目前不知道是否兼容gcov。

标签: c++ clang clang++ gcov


【解决方案1】:

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

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

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

【讨论】:

  • 这曾经指向 Clang 手册的有效版本,但现在在 CLang 12 中,它只包含对新消毒剂覆盖范围“-fprofile-instr-generate”的描述,不再包含 gcov 格式。跨度>
  • 感谢@Lothar 的提醒,已将答案更新为指向llvm-cov gcov 文档。但另一个答案可能更相关。
【解决方案2】:

在尝试使用 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-compatible coverage implementation

关于编译器选项的说明

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

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多