【问题标题】:coverage with gcc9 and lcov覆盖 gcc9 和 lcov
【发布时间】:2019-11-05 04:43:53
【问题描述】:

最近的一次操作系统升级让我的覆盖脚本惨遭失败。

lcov 1.13

gcov (GCC) 9.1.1

我的 CMake 中用于生成覆盖率数据的部分:

if ($ENV{COVERAGE})
    message("Setting up for coverage")
    enable_testing()
    include(CodeCoverage)
    setup_target_for_coverage(${PROJECT_NAME}_coverage tests coverage)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  --coverage")
endif ()

我在构建测试后发出的lcov 命令: lcov --capture --directory build/ --output-file coverage.info

不幸的是,现在失败了:

Capturing coverage data from build/
Found gcov version: 9.1.1
Scanning build/ for .gcda files ...
geninfo: WARNING: no .gcda files found in build/ - skipping!
Finished .info-file creation

错误消息是有意义的,因为没有 .gcda 文件 - 只有 .gcno 文件。我不确定它们是否具有相同的目的和/或可以与lcov 一起使用。

我发了nm some_binary | grep gcov,里面有很多符号的形式:

00000000004b3520 d __gcov_._ZZZN6__pstl10__internal15__pattern_walk2IRKNS_9execution2v115parallel_policyEN9__gnu_cxx17__normal_iteratorIPKiSt6vectorIiSaIiEEEENS8_IPiSD_EEZSt9transformIS6_SE_SG_ZN12_GLOBAL__N_150ParallelTransformTest_NoDataShouldReturnEmpty_Test8TestBodyEvEUlRKT_E_ENSt9enable_ifIXsrNS3_19is_execution_policyINSt5decayISK_E4typeEEE5valueET1_E4typeEOSK_T0_SY_SU_T2_EUlRS9_RiE_St17integral_constantIbLb0EEEESU_SX_SY_SY_SU_SZ_T3_S13_IbLb1EEENKUlvE_clEvENKUlSE_SE_E_clESE_SE_

所以我猜 CMake 仍然正确地尝试给我覆盖数据。

如果我没记错的话,它在 gcc 7 上运行良好。

是否有新的解决方案/要发布的 CMake 标志/要发布的 lcov 标志?还是它现在坏了并且没有解决方法?或者我一直在做一些奇怪的事情?

【问题讨论】:

    标签: c++ cmake code-coverage gcov lcov


    【解决方案1】:

    我相信 GCC 9 现在默认将覆盖数据输出为 JSON,如 change notes 中所述。

    gcov 工具已将其中间格式更改为新的 JSON 格式。

    看起来 lcov 也有一个开放的issue 来处理这种新格式。

    【讨论】:

    • 看来是这样。任何已知的解决方法?我不愿意为了获得覆盖而在不同的编译器版本下重新编译整个项目。
    • 对 lcov 上的 master 分支的最新提交实际上应该解决这个问题,因此您可以尝试从源代码构建 lcov。我似乎找不到任何可以在 GCC 中配置的建议,因此这可能是您目前唯一的选择。
    • 是的,从 master 运行 lcov 确实允许解析中间 gcov 格式 - 尽管我需要安装额外的包,如 zlib 或来自 cpan 的一堆 Perl 模块。不是很干净,但可以解决问题。
    猜你喜欢
    • 2014-10-24
    • 2015-12-30
    • 1970-01-01
    • 2017-03-29
    • 2012-09-03
    • 2016-12-28
    • 2017-05-20
    • 2017-03-31
    • 2014-03-21
    相关资源
    最近更新 更多