【问题标题】:Getting llvm-cov to talk to codecov.io让 llvm-cov 与 codecov.io 对话
【发布时间】:2018-11-09 20:02:53
【问题描述】:

我正在(终于!)为我的全新 C++ 项目设置代码覆盖率监控。由于我需要一些高级 C++20 功能(读取、协程),我使用 clang 6 作为编译器。

现在,我跟随this guide 了解如何为您的项目进行基本代码覆盖,一切都像魔术一样工作。如果我这样做:

clang++ -fprofile-instr-generate -fcoverage-mapping test.cpp -o test.out
LLVM_PROFILE_FILE="coverage/test.profraw" ./test.out
llvm-profdata merge -sparse coverage/test.profraw -o coverage/test.profdata
llvm-cov show ./test.out -instr-profile=coverage/test.profdata

我在终端上收到一份漂亮的彩色报告,告诉我哪些内容被覆盖,哪些未被覆盖。

到目前为止一切顺利!我以为我已经接近我想要的了,但是当我试图将报告上传到codecov.io 时,痛苦就开始了。

我尝试了一些方法,包括:

  • 在我的coverage 文件夹上运行他们的https://codecov.io/bash 脚本,希望它可能会赶上我的test.profdata。没有骰子,这是有道理的,因为即使llvm-cov 也需要可执行文件的路径才能运行。

  • 使用export 功能:运行llvm-cov export --instr-profile=coverage/test.profdata ./test.out 时,我得到一个漂亮的JSON 文件(通过终端)。我尝试将输出放入 coverage.json 文件中,该文件实际上已上传,但随后 codecov 只是说解析它时出错,没有更多信息。

我感到完全迷失了。他们网站上的一切似乎都是黑盒式的,我只是不明白如何完成任何不完全符合他们可以管理的案例的事情。

我怎样才能让它与 codecov 一起使用?如果 codecov 无法处理我的报告,是否有任何其他等效的在线代码覆盖率可以用来让它工作?

【问题讨论】:

    标签: code-coverage codecov llvm-cov


    【解决方案1】:

    看起来,codecov 用于将覆盖率数据上传到其网站的 bash 脚本会查找与它所理解的格式相关的各种模式匹配的文件。这些记录很少,但您至少可以通过查看the script on Github 来了解哪些模式是可行的。当然,这并不能告诉您 codecov 对匹配给定模式的文件格式有什么期望,正如您在 coverage.json 文件被拒绝时发现的那样。

    通过反复试验,我发现以下内容会生成一个文件,当您运行 bash 脚本时,codecov 将正确解释:

    llvm-cov show ./test.out -instr-profile=default.profdata > coverage.txt

    我尚未广泛测试允许使用哪些文件名,但您似乎可以在将覆盖率数据传输到的文件名中的 coverage.txt 之间添加任何其他字符(例如,你可以称它为coverage_my_file_name.txt)。

    编辑:以防万一这对任何人都有帮助,事实证明,上面的一个重要推论是,避免命名任何不是覆盖报告的内容与此模式匹配是至关重要的。我刚刚处理了一个场景,其中我有一堆名为coverage_[more_text_here].out 的可执行文件与报告一起上传。事实证明,尝试将汇编代码解析为覆盖率报告可能会导致 codecov 神秘地失败而没有任何有用的错误。

    【讨论】:

      【解决方案2】:

      另一种选择是使用 GCOV 分析,它比基于源的精度稍差,但 codecov.io 支持。您需要“--coverage”编译器标志来启用它。

      您可以使用grcov(也可以从https://github.com/mozilla/grcov/releases下载)解析gcno/gcda文件并通过codecov.io bash上传器上传:

      grcov OBJ_DIR -s SRC_DIR -t lcov --branch > lcov.info
      bash codecov.sh -f "lcov.info"
      

      我计划在 grcov 中添加对基于源的报告的支持,这也将更容易支持 codecov 上的格式。

      【讨论】:

        猜你喜欢
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 2014-12-01
        • 2016-11-10
        • 2015-09-06
        • 2010-09-12
        相关资源
        最近更新 更多