为什么我无法使用CMake获取Valgrind诊断信息?

为什么我无法使用CMake获取Valgrind诊断信息?,cmake,valgrind,Cmake,Valgrind,我现在在UbuntuLinux上运行CTest,无论是否使用Valgrind。首先,我设置了一个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") en

我现在在UbuntuLinux上运行CTest,无论是否使用Valgrind。首先,我设置了一个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:
这绝对不是我所期望的诊断信息。我在想我下一步该做什么。谢谢

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

我使用一个python脚本来解析我从valgrind泄漏的内存,因为它是可用的

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

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

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

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

尝试使用运行cmake

cmake -DCMAKE_BUILD_TYPE=Debug /path/to/source

它应该添加用于生成调试符号的编译器选项。

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这样的构建服务器可以更容易地显示它。为此,您必须使用
--log fd=2
(以及其他选项,如果您愿意)设置
MEMORYCHECK\u COMMAND\u OPTIONS
变量,使其覆盖
--log file
选项。
更多信息。

Debug是缓存文件中定义的生成类型之一,在使用它时,它只发送一个特定的附加字符串。它的定义方式可能会有所不同,您可以对其进行编辑。