我现在在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:
这绝对不是我期望的诊断信息。我想知道下一步该做什么。谢谢!
修改: 稍后,我发现只有在发生内存泄漏的情况下才能使用诊断信息。然而,在没有给出发生错误的位置的意义上,诊断信息非常模糊。我怎样才能获得更详细的信息?
答案 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无法确定源代码中泄漏的确切位置。
尝试使用
运行cmakecmake -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。