【问题标题】:How to pass arguments to memcheck with ctest?如何使用 ctest 将参数传递给 memcheck?
【发布时间】:2019-03-14 19:41:17
【问题描述】:

我想从命令行使用 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_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 命令?

【问题讨论】:

    标签: command-line cmake valgrind ctest memcheck


    【解决方案1】:

    TL;DR

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

    说明

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

    在顶级源目录中的CTestConfig.cmakeCMakeLists.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. 我在网上看到了mentionsCMAKE_MEMORYCHECK_COMMAND_OPTIONS 变量。我不知道这个变量是什么,我不认为 cmake 以任何方式知道它。
    2. CTestConfig.cmakeCMakeLists.txt 中设置CTEST_MEMORYCHECK_COMMAND_OPTIONS(cmake 文档中实际上是documented 的变量)无效。看来这个变量只适用于"CTest Client Scripts",我没用过。
    3. 很遗憾,MEMORYCHECK_COMMAND_OPTIONSMEMORYCHECK_SUPPRESSIONS_FILE 都没有在 cmake 中明确记录,只是在 ctest 文档和 Testing With 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")
    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 2014-11-12
    • 2013-06-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多