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

时间:2018-10-10 00:25:26

标签: command-line cmake valgrind ctest memcheck

我想从命令行使用ctest来使用memcheck运行测试并为memcheck命令传递参数。

我可以运行ctest -R my_test来运行测试,甚至可以运行ctest -R my_test -T memcheck来通过memcheck运行它。

但是我似乎找不到找到将参数传递给该memcheck命令的方法,例如--leak-check=full--suppressions=/path/to/file

阅读ctest的文档后,我尝试将-DCTEST_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 个答案:

答案 0 :(得分:0)

TL; DR

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

说明

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

在顶级源目录的CTestConfig.cmake中或CMakeLists.txt中(在调用include(CTest)之前的 中),您可以设置{{1} }或MEMORCHECK_COMMAND_OPTIONS。 当您MEMORYCHECK_SUPPRESSIONS_FILE时,CMake将在您的构建目录中生成一个include(CTest),并且设置上述变量将分别在此文件中填充DartConfiguration.tclMemoryCheckCommandOptions。 这是MemoryCheckSuppressionFile在构建目录中解析的文件,用于填充其内部变量以运行ctest步骤。 因此,如果要在cmake配置期间设置项目的memcheck选项,这就是获得方法。

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

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

注释

  1. 我在线上看到了--overwrite变量的mentions。我不知道这个变量是什么,我不认为cmake会以任何方式知道它。
  2. CMAKE_MEMORYCHECK_COMMAND_OPTIONSCTEST_MEMORYCHECK_COMMAND_OPTIONS中设置CTestConfig.cmake(在cmake文档中实际上为documented的变量)无效。看来此变量仅在"CTest Client Scripts"中有效,我从未使用过。
  3. 不幸的是,cmake中没有明确记录CMakeLists.txtMEMORCHECK_COMMAND_OPTIONS,而在ctest文档和Testing With CTest教程中却没有间接记录。
  4. li>

在构建中运行MEMORYCHECK_SUPPRESSIONS_FILE时,它将解析文件以填充内部变量: https://cmake.org/cmake/help/latest/manual/ctest.1.html#dashboard-client-via-ctest-command-line 我不清楚这与

如何相互作用