1

我现在在 Ubuntu Linux 中使用或不使用 Valgrind 运行 CTest。首先,我设置了一个 CMakeLists.txt 脚本来启用测试:

enable_testing()
include(CTest)
if(UNIX)
  set(CTEST_MEMORYCHECK_COMMAND, "usr/bin/valgrind")
  set(CTEST_MEMORYCHECK_COMMAND_OPTIONS, "--trace-children=yes --leak-check=full")
endif()

add_test(NAME test
        WORKING_DIRECTORY ${my_outputdirectory}
        COMMAND test_exe)

当我在没有 valgrind 的情况下运行测试时,我使用以下命令:

cmake -G "CodeBlocks - Unix Makefiles"
ctest -D ExperimentalBuild  
ctest -R test -D ExperimentalTest  

这很好用。但是,当我运行以下命令来调用 valgrind 时:

 cmake -G "CodeBlocks - Unix Makefiles"
    ctest -D ExperimentalBuild  
    ctest -R test -D ExperimentalMemChec

出现以下消息:

--Processing memory checking output:
Memory checking results:

这绝对不是我期望的诊断信息。我在想我接下来应该做什么。谢谢!

编辑:后来,我发现诊断信息只有在发生内存泄漏的情况下才可用。然而,诊断信息在没有给出错误发生位置的意义上是非常模糊的。我怎样才能获得更详细的信息?

4

3 回答 3

1

默认情况下,CMake 不会为 Makefile 项目构建调试符号,因此 Valgrind 无法确定源代码中泄漏的确切位置。

尝试运行 cmake

cmake -DCMAKE_BUILD_TYPE=Debug /path/to/source

这应该添加用于构建调试符号的编译器选项。

于 2013-06-03T10:28:22.827 回答
1

我使用了一个 python 脚本来解析我的 valgrind 的内存泄漏,它可以在这里找到

在 CMake 中,我使用以下命令添加内存测试:

ADD_TEST(testName ${Test_Dir}/memtest.py ${CMAKE_CURRENT_BINARY_DIR}/testExecutable ${CMAKE_BINARY_DIR})

这样我就不需要直接在 cmake 中解析内存泄漏错误。python 脚本只是在可执行文件上使用 valgrind 执行内存检查,如果发现泄漏则返回错误。如果发现泄漏,则测试失败,否则测试通过。希望这可以帮助你。

于 2013-06-03T09:49:40.420 回答
1

默认情况下,CMake 对 valgrind memcheck 使用以下命令行参数:

--log-file=/Path/to/build-dir/Testing/Temporary/MemoryChecker.1.log \
-q --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50

请注意,该--log-file参数意味着任何 valgrind 错误都会出现在该文件中。我发现当 valgrind 将信息发布到 stderr 时它更有用,因此像 Jenkins 或 TeamCity 这样的构建服务器可以更轻松地显示它。为此,您必须使用(以及其他选项,如果您愿意)设置MEMORYCHECK_COMMAND_OPTIONS变量,以便它覆盖该选项。更多信息在这里--log-fd=2--log-file

于 2019-05-13T16:38:04.337 回答