[英]How do I add valgrind tests to my cmake “test” target
我通过使用ninja
构建来运行单元测试,然后从我的构建树中运行ninja test
:
cmake -G Ninja /source/tree
ninja
ninja test
但是,要运行 valgrind,我需要手动运行它:
valgrind rel/path/to/test
我希望valgrind
在运行ninja test
时自动运行。 根据 cmake 文档“设置 [valgrind 测试]非常容易” ,但是当我运行时
ctest -D NightlyMemoryCheck
我刚收到这个错误:
Cannot find file: /home/arman/tinman/deb/DartConfiguration.tcl
Site:
Build name: (empty)
WARNING: No nightly start time found please set in CTestConfig.cmake or DartConfig.cmake
Problem initializing the dashboard.
当我按照这个 SO 问题中的说明进行操作时,我收到了类似的错误:
如何让 ctest 在没有 dart 的情况下使用 valgrind 运行程序?
我不知道dart
是什么,但根据网站,它是某种在线测试小玩意。
显然,极其简单对我来说还不够简单。 难道一个解决方案是这样的超级容易,你就必须是某种IT的人知道术士,使其无法工作?
这是一个自包含示例,展示了如何将 valgrind 测试添加到 CMake 项目。 该示例由单个 C++ 源文件main.cpp
:
#include <iostream>
int main()
{
double* leak = new double[10];
std::cout << "Hello!" << std::endl;
}
该代码包含故意泄漏,应由 valgrind 发现。 我们还需要一个需要 CMake >= 2.8 的CMakeLists.txt
文件:
cmake_minimum_required(VERSION 2.8)
project (ValgrindExample)
include (CTest)
add_executable(example main.cpp)
add_test(example_test example)
在这里,重要的是将 CTest 模块包含在include
而不是仅使用enable_testing()
启用测试。 CTest 模块负责设置能够通过测试运行内存检查的机制(例如,它定位 valgrind 可执行文件)。
现在我们可以在项目文件夹中打开一个 shell 会话并创建一个 Ninja 构建树:
$ mkdir build; cd build
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..
我们可以在没有valgrind 的情况下以常规方式构建和运行测试:
$ ninja
[2/2] Linking CXX executable example
$ ninja test
[0/1] Running tests...
...
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.01 sec
要使用valgrind 运行测试,我们必须使用带有测试操作memcheck
CMake 的 ctest 可执行文件:
$ ctest -T memcheck
...
1/1 MemCheck #1: example_test ..................... Passed 0.77 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.77 sec
-- Processing memory checking output:
Memory checking results:
Memory Leak - 2
ctest 打印内存检查结果的摘要。 valgrind 的详细输出位于构建树的临时目录中:
$ cat ./Testing/Temporary/MemoryChecker.*.log
==4565== 80 bytes in 1 blocks are definitely lost in loss record 37 of 64
==4565== at 0x10000B681: malloc (in /usr/local/Cellar/valgrind/3.12.0/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==4565== by 0x1000507DD: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==4565== by 0x100000F93: main (main.cpp:5)
...
运行ninja test
时无法自动运行 valgrind,因为 CMake 的内置测试目标无法修改并且始终以常规方式运行测试。 然而,我们可以添加一个自定义的 CMake 目标,它使用-T memcheck
选项调用 ctest,然后打印详细的 valgrind 报告:
add_custom_target(test_memcheck
COMMAND ${CMAKE_CTEST_COMMAND}
--force-new-ctest-process --test-action memcheck
COMMAND cat "${CMAKE_BINARY_DIR}/Testing/Temporary/MemoryChecker.*.log"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
--test-action
是开关-T
的详细版本。
然后我们可以从 Ninja 调用 valgrind 测试
$ ninja test_memcheck
并获得结果,就像我们手动运行 valgrind 一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.