c++ - clang++ 总是生成空的 profraw 覆盖率报告

标签 c++ code-coverage clang++ llvm-clang

我第一次尝试将 C++ 中的覆盖率与 clang 6 集成,并且一直在关注 this指导。

我成功编译了二进制文件,生成了一个 .profraw 文件并生成了一个 .profdata 文件,如步骤 1、2 和 3a 中所述。但是,当我尝试创建 3b 中描述的面向线路的覆盖率报告时,我收到以下消息:

error: build/debug/dane: Failed to load coverage: No coverage data found

检查.profraw 文件后,我发现它是空的。我尝试稍微更改我的代码并再次运行,但生成的 .profraw 始终为空。

我的 main.cpp 文件:

#include <iostream>

int main(int argc, char **argv) {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

我的SConstruct 文件:


env = Environment(CXX='clang++', CXXFLAGS=['-Wall', '-g', '-O0'], LINKFLAGS=['-fprofile-instr-generate', '-fcoverage-mapping'])
env.Program(target='build/debug/dane', source=['src/main.cpp'])

命令行输出:

➤ scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
clang++ -o src/main.o -c -Wall -g -O0 src/main.cpp
clang++ -o build/debug/dane -fprofile-instr-generate -fcoverage-mapping src/main.o
scons: done building targets.
➤ build/debug/dane
Hello, World!
➤ llvm-profdata merge -sparse default.profraw -o default.profdata
➤ llvm-cov show build/debug/dane -instr-profile=default.profdata
error: build/debug/dane: Failed to load coverage: No coverage data found

我希望 default.profraw 文件包含有意义的覆盖率结果,但不知道为什么它是空的。

最佳答案

终于解决了。 起初我将 -fprofile-instr-generate -fcoverage-mapping 标志作为 CXXFLAGS,但它没有用,所以我明白这些是链接器标志和将它们移动到 LINKFLAGS(这导致了这篇令人沮丧的帖子)。 显然,这些标志需要同时作为编译标志和链接器标志出现才能使整个工作正常进行。 我还尝试检查您是否可以在编译器和链接器之间分发标志,但没有成功。

关于c++ - clang++ 总是生成空的 profraw 覆盖率报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57515488/

相关文章:

c++ - 我在内存泄漏和字符串方面遇到了一个非常奇怪的问题

c++ - Proactor 和异步写入

C++ 三元运算符的使用

c++ - 如何在 C++ 中使用数学

扩展抽象类的类的 PHPUnit 代码覆盖率

javascript - 使用 Node-jsCoverage 、 Mocha 和 Express 进行功能测试覆盖率报告

python - 如何在单个 html 文件中获取 django 覆盖率报告

c++ - 没有返回语句时的 Clang 优化 : if(false) is entered?

c++ - 浮点舍入为 80 位寄存器和 64 位 double : ill-formed code or gcc/clang bug? 提供不同的结果

c++ - Typedef 到 C++ 中的周围类型