繁体   English   中英

如何将 valgrind 测试添加到我的 cmake“测试”目标

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM