c++ - 当我用 clang 编译我的代码时,gcov 抛出内存不足错误
问题描述
我正在尝试建立一个基本项目,并且我想使用 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++ 相同。
知道什么是错的,我能做些什么吗?
谢谢!
解决方案
在尝试lcov
使用gcovr
.
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.0
,gcov
因此是 bash 脚本间接。不要忘记使文件可执行!
回到你的问题
我想你只需要替换gcov main.gcno
为llvm-cov-6.0 gcov main.gcno
. 这不是使用 LLVM 真正的基于源的覆盖工具,而是使用其与gcov 兼容的覆盖实现。
注意编译器选项
在我的设置中,我只是--coverage
作为编译器选项传递,这应该足够了。
推荐阅读
- google-apps-script - 将 PDF 转换为 gDoc
- assembly - MOV 指令实际上在 CPU 级别执行的不仅仅是一项原子操作吗?
- c# - 尝试在 C# Winform 中查询 PostgreSQL 数据库时,ExecuteReader 上出现 Npgsql.PostgresException 错误
- javascript - 从编辑弹出窗口保存数据
- javascript - 如果项目已经存在并更改按钮状态,如何从存储在本地存储中的数组中删除项目
- scala - 如何通过scala-slick在同一行中将一列的值设置为另一列
- javascript - 为什么 `merge` 操作符在源 observables 完成之前完成?
- vbscript - VB SCript - CreateObject 挂起程序
- python - 从 qualtrics 导出响应数据时,导出实际响应而不仅仅是问题响应 ID
- java - 如何在没有火花的情况下从 S3 读取 Parquet 文件?爪哇