如何使用ctest将参数传递给memcheck?

11
我想在命令行中使用ctest运行我的测试,并传入memcheck的参数。
我可以运行ctest -R my_test来运行我的测试,甚至可以通过ctest -R my_test -T memcheck用memcheck运行它。
但是,我似乎找不到一种方法来传递那个memcheck命令的参数,比如--leak-check=full--suppressions=/path/to/file
阅读了ctest的文档后,我尝试使用-D选项与CTEST_MEMCHECK_COMMAND_OPTIONSMEMCHECK_COMMAND_OPTIONS。我还尝试将这些设置为环境变量。我的所有尝试都没有产生任何不同的测试命令。它总是:
Memory check command: /path/to/valgrind "--log-file=/path/to/build/Testing/Temporary/MemoryChecker.7.log" "-q" "--tool=memcheck" "--leak-check=yes" "--show-reachable=yes" "--num-callers=50"

我该如何从 ctest 命令行控制 memcheck 命令?
1个回答

22
TL;DR:
ctest --overwrite MemoryCheckCommandOptions="--leak-check=full --error-exitcode=100" \
      --overwrite MemoryCheckSuppressionFile=/path/to/valgrind.suppressions \
      -T memcheck

解释

我终于找到了覆盖这些变量的正确方法,但不幸的是从文档中很难理解这一点。 因此,为了帮助下一个需要处理这个问题的可怜人,这里是我对设置 memcheck 选项的各种方式的理解。

在您顶级源目录中的CTestConfig.cmakeCMakeLists.txtinclude(CTest)之前),您可以设置 MEMORYCHECK_COMMAND_OPTIONS MEMORYCHECK_SUPPRESSIONS_FILE 。 当您include(CTest)时,CMake将在您的构建目录中生成一个DartConfiguration.tcl,并设置上述变量将分别在此文件中填充MemoryCheckCommandOptionsMemoryCheckSuppressionFile。 这是ctest在您的构建目录中解析以填充其运行 memcheck 步骤的内部变量的文件。 因此,如果您想在cmake配置期间设置项目的memcheck选项,则应该使用此方法。

如果您想在已经正确配置的构建目录之后修改这些选项,可以:

  1. 直接修改DartConfiguration.tcl,但请注意,如果再次运行cmake,则会覆盖此文件,因为每次运行cmake时都会重新生成此文件。
  2. 使用ctest --overwrite命令行选项仅为该运行设置这些memcheck选项。

注释

  1. 我在网上看到提到一个CMAKE_MEMORYCHECK_COMMAND_OPTIONS变量。我不知道这个变量是什么,我认为cmake无论如何都不知道它。
  2. 在您的CTestConfig.cmakeCMakeLists.txt中设置cmake文档中实际记录的CTEST_MEMORYCHECK_COMMAND_OPTIONS变量没有效果。似乎这个变量只适用于CTest客户端脚本,而我从未使用过。
  3. 不幸的是,cmake没有明确记录MEMORYCHECK_COMMAND_OPTIONSMEMORYCHECK_SUPPRESSIONS_FILE,只有在ctest文档和使用CTest进行测试教程中间接记录。

当在构建中运行ctest时,它会解析文件以填充其内部变量: https://cmake.org/cmake/help/latest/manual/ctest.1.html#dashboard-client-via-ctest-command-line 我不清楚这与何种交互方式。


+1 overwrite MemoryCheckSuppressionFile=/path/to/valgrind.suppressions 并不是很有用,因为它需要一个绝对路径。我还没有找到在Cmake文件中实现set(MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/.valgrind-suppressions")的等效方法。 - alfC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接