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

How to pass arguments to memcheck with ctest?

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

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

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

阅读 ctest 的文档后,我尝试将 -D 选项与 CTEST_MEMCHECK_COMMAND_OPTIONSMEMCHECK_COMMAND_OPTIONS 一起使用。我还尝试将它们设置为环境变量。 None 我的尝试产生了任何不同的测试命令。总是:

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 命令?

TL;DR

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

说明

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

设置选项的各种方法的理解

在 top-level 源目录中的 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 运行s会被覆盖,因为每次cmake 运行s都会重新生成这个文件。
  2. 使用 ctest --overwrite command-line 选项为 运行.
  3. 设置这些 memcheck 选项

备注

  1. 我在网上看到 mentions 一个 CMAKE_MEMORYCHECK_COMMAND_OPTIONS 变量。我不知道这个变量是什么,我不认为 cmake 以任何方式知道它。
  2. 设置CTEST_MEMORYCHECK_COMMAND_OPTIONS(实际上是documented in the cmake docs) in your CTestConfig.cmake or CMakeLists.txt has no effect. It seems this variable only works in "CTest Client Scripts"的变量,我没用过
  3. 不幸的是,MEMORYCHECK_COMMAND_OPTIONSMEMORYCHECK_SUPPRESSIONS_FILE 都没有在 cmake, only indirectly, in ctest documentation and the Testing With CTest 教程中明确记录。

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

相互作用的