【问题标题】:Code coverage warrnings spam output代码覆盖警告垃圾邮件输出
【发布时间】:2017-06-15 15:42:49
【问题描述】:


在 CMake 测试配置中,我添加了标志来生成代码覆盖率

IF( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
    "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  SET(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
  SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage ")
endif()

每次我运行测试时 - 我的输出都会包含这些消息:

分析:/xxxx/xxxxxj/projects/build-xxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxt_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda:无法合并以前的 GCDA 文件:计数器数量不匹配(14)

简介: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/gui/ship_design/ut_ship_stats_header.cpp.gcda: 无法合并以前的 GCDA 文件:损坏的 arc 标记 (0x2b8e100f)

简介: /xxxx/xxxxxx/projects/build-xxxxxxxxxxxxxxx-CLang-Debug/tests/CMakeFiles/xxxxxxxxxxxxxxx_ut.dir/tests/ut_generate_hex_path.cpp.gcda: 无法合并以前的 GCDA 文件:损坏的 arc 标记 (0x65646f6e)

我不必说这至少会使读取测试运行结果变得困难。当我删除之前生成的所有 gcda 文件时,上述问题消失了。所以有两种可能的解决方案。

  • 我可能会错过一些有价值的代码覆盖数据配置(即调用 lcov --zerocounters

FIND_PROGRAM(LCOV_PATH lcov)

命令 ${LCOV_PATH} -z --directory ${PROJECT_BINARY_DIR}}

  • 我需要在提交测试运行之前添加自定义目标以删除所有 gcda 文件。

我应该如何解决这个问题?

【问题讨论】:

  • 在编译源代码之前清除 *.gcda 文件
  • quote “当我删除之前生成的所有 gcda 文件时,上述问题消失了”。然而,问题在另一个链接和测试运行中重复出现。问题是 - 如何修改 CMake 或其他系统以使其自动化。

标签: c++ cmake code-coverage gcov


【解决方案1】:

我认为您可能在工作流程中做了一些不寻常的事情,因为您看到的问题不应该一直发生。但是,我在这里添加的内容应该可以帮助您解决这个问题,或者完全解决它。

首先,您应该利用 CMake 的 build-types 并创建自己的“覆盖类型”。

## coverage flags
set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C++ compiler during coverage builds.")
set(CMAKE_C_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the C compiler during coverage builds.")
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used for linking binaries during coverage builds.")
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "-g -O0 -fprofile-arcs -ftest-coverage" CACHE STRING "Flags used by the shared libraries linker during coverage builds.")

mark_as_advanced(
  CMAKE_CXX_FLAGS_COVERAGE
  CMAKE_C_FLAGS_COVERAGE
  CMAKE_EXE_LINKER_FLAGS_COVERAGE
  CMAKE_SHARED_LINKER_FLAGS_COVERAGE)

## Update the documentation string of CMAKE_BUILD_TYPE for GUIs
set(CMAKE_BUILD_TYPE "${CMAKE_BUILD_TYPE}" CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel RelWithAssert Coverage." FORCE)

然后创建一个custom target

## create our "make coverage" target
add_custom_target(coverage
  COMMAND if test ! -d ../output \; then mkdir ../output\; fi
  COMMAND find ${CMAKE_BINARY_DIR} -name \*.gcda -delete
  COMMAND lcov -b CMakeFiles/ -d . -z
  COMMAND lcov -b -d . -c -i -o test_base.info
  COMMAND ./env-shell.sh ctest -j2 || true
  COMMAND lcov -b CMakeFiles/ -d . -c -o test_run.info
  COMMAND lcov -b CMakeFiles/ -d . -a test_base.info -a test_run.info -o test_total.info
  COMMAND lcov -o reports.info -r test_total.info '/usr/include/*' '/usr/local/*' '/cvmfs/*' '*/numpy' '/usr/lib/gcc/*' ${p} '${CMAKE_BINARY_DIR}/CMakeFiles/' '${CMAKE_BINARY_DIR}/steamshovel/*'
  COMMAND genhtml --ignore-errors source --legend -o ../output/`date +%Y-%m-%d` reports.info
)

现在,利用源外构建,在与源代码平行的“覆盖”目录中运行 cmake

$ pwd
/home/user/my_project/src
$ mkdir ../coverage
$ cd ../coverage
$ cmake -DCMAKE_BUILD_TYPE=Coverage ../src
[ ... cmake's output here ...]
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/my_project/coverage

$ 

现在,构建您的项目和测试,并运行您的“覆盖”目标。

$ make
$ make test-bins
$ make coverage
[ ... make's output here ... ]
$ 

我们在 CMakeLists.txt 中定义的 make coverage 目标将:

  1. 如果它不存在,则创建一个与我们的源和构建目录平行的“输出”目录
  2. 在当前构建目录中查找并删除所有*.gcda 文件
  3. 清零并初始化我们的lcov 计数器和输出文件
  4. 通过ctest 运行我们的测试
  5. “编译”lcov 输出并生成我们的 HTML 覆盖率报告

请注意,您可能需要针对特定​​项目进行调整。

在这一点上,我强烈建议将所有这些自动化。将它添加到您的持续集成中,如果您有的话,或者甚至设置一个cron 工作,以便它在一夜之间运行,并且您有一个全新的覆盖率报告来开始新的一天。 (这些示例来自一个由buildbot 处理的夜间覆盖报告的工作项目。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2011-07-12
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多