为什么我不能用CMake获取Valgrind诊断信息?

时间:2013-06-03 09:37:13

标签: cmake valgrind

我现在在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:

这绝对不是我期望的诊断信息。我想知道下一步该做什么。谢谢!

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

3 个答案:

答案 0 :(得分:1)

我使用python脚本来解析valgrind的内存泄漏,它可用here

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

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

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

答案 1 :(得分:1)

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

尝试使用

运行cmake
cmake -DCMAKE_BUILD_TYPE=Debug /path/to/source

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

答案 2 :(得分:0)

默认情况下,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选项。 更多信息here