7

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

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

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

在阅读了 ctest 的文档后,我尝试使用带有and的-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 命令?

4

1 回答 1

16

TL;博士

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

解释

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

CTestConfig.cmake您的顶级源目录中,或在CMakeLists.txt(调用之前include(CTest))中,您可以设置MEMORYCHECK_COMMAND_OPTIONSMEMORYCHECK_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. 在您的或中设置(实际记录在 cmake 文档中CTEST_MEMORYCHECK_COMMAND_OPTIONS的变量)或无效。看来这个变量只适用于我从未使用过的"CTest Client Scripts" 。CTestConfig.cmakeCMakeLists.txt
  3. 不幸的是,两者MEMORYCHECK_COMMAND_OPTIONSMEMORYCHECK_SUPPRESSIONS_FILE没有在cmake中明确记录,只是间接地,在ctest文档和使用 CTest 测试教程中。

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

于 2019-05-13T16:21:46.180 回答