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

dcm*_*m88 3 command-line valgrind cmake 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 的文档后,我尝试将-D选项与CTEST_MEMCHECK_COMMAND_OPTIONS和 一起使用MEMCHECK_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"
Run Code Online (Sandbox Code Playgroud)

如何从 ctest 命令行控制 memcheck 命令?

dcm*_*m88 10

TL; 博士

ctest --overwrite MemoryCheckCommandOptions="--leak-check=full --error-exitcode=100" \
      --overwrite MemoryCheckSuppressionFile=/path/to/valgrind.suppressions \
      -T memcheck
Run Code Online (Sandbox Code Playgroud)

解释

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

CTestConfig.cmake顶级源目录中的 a 中,或在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. 在您的or 中设置CTEST_MEMORYCHECK_COMMAND_OPTIONS(实际记录在 cmake 文档中的变量)没有效果。似乎这个变量只适用于我从未使用过的"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 我不清楚这是如何与