如何让ctest用valgrind运行一个没有dart的程序?

时间:2012-02-16 00:15:58

标签: cmake valgrind

我想写一个CMakeLists.txt,以便我可以正常运行我的测试或使用valgrind。我已经看到很多关于将ctest与valgrind集成,但所有这些都假设您要设置服务器以将测试结果提交到飞镖仪表板。我只想在我的机器上运行测试并在命令行上查看结果。

如果我必须做一个cmake -D VALGRIND = ON就好了,但如果可能的话,我宁愿生成名为“foo”和“valgrind_foo”的测试。

4 个答案:

答案 0 :(得分:23)

我使用valgrind进行内存检查。要配置valgrind,我在构建系统中定义了以下变量:

find_program( MEMORYCHECK_COMMAND valgrind )
set( MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full" )

此外,还有我的valgrind抑制文件:

set( MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/valgrind_suppress.txt" )

编写CMakeLists.txt文件并在其中正确配置valgrind后,可以运行以下命令:

cmake -G ... (to configure your build)
ctest -D ExperimentalBuild (this will build your code)
ctest -R testName -D ExperimentalTest (just runs the test)
ctest -R testName -D ExperimentalMemCheck (to run the test under valgrind)

这将欺骗您的构建系统在本地运行测试自动化。它希望你运行:

ctest -R testName -D ExperimentalSubmit

接下来,要提交到(默认或您的)信息中心,但您不需要执行此步骤来运行您想要的内容。结果将存储在Testing / Temporary /目录中。

答案 1 :(得分:6)

看来以下就足够了。我之前没有使用separate_arguments,这是我的愚蠢。

function(add_memcheck_test name binary)
  set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}")
  separate_arguments(memcheck_command)
  add_test(${name} ${binary} ${ARGN})
  add_test(memcheck_${name} ${memcheck_command} ./${binary} ${ARGN})
endfunction(add_memcheck_test)

function(set_memcheck_test_properties name)
  set_tests_properties(${name} ${ARGN})
  set_tests_properties(memcheck_${name} ${ARGN})
endfunction(set_memcheck_test_properties)

答案 2 :(得分:0)

我的情况很简单,我只使用了自定义目标:

project(bftest)

add_executable(bftest main.c)

target_link_libraries(bftest LINK_PUBLIC bf)

find_program(VALGRIND "valgrind")
if(VALGRIND)
    add_custom_target(valgrind
        COMMAND "${VALGRIND}" --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $<TARGET_FILE:bftest>)
endif()

答案 3 :(得分:0)

您可以使用add_custom_target()生成最小的'DartConfiguration.tcl'配置文件。然后,您可以添加一个valgrind自定义目标,该目标使用适当的参数调用ctest。这是我通常的做法:

find_program(VALGRIND "valgrind")
if (VALGRIND)
    set(DART_CONFIG DartConfiguration.tcl)
    add_custom_target(${DART_CONFIG}
        COMMAND echo "MemoryCheckCommand: ${VALGRIND}" >> ${DART_CONFIG}
        COMMENT "Generating ${DART_CONFIG}"
    )
    set(VALGRIND_ARGS
        --leak-check=full
        --error-exitcode=255
    )
    set(LOGFILE memcheck.log)
    add_custom_target(valgrind        
        COMMAND ctest -O ${LOGFILE} -D ExperimentalMemCheck --overwrite MemoryCheckCommandOptions="${VALGRIND_ARGS}"
        COMMAND tail -n1 ${LOGFILE} | grep 'Memory checking results:' > /dev/null
        COMMAND rm -f ${LOGFILE}
        DEPENDS ${DART_CONFIG}
    )
endif()

希望这会有所帮助! :-)

信用:https://github.com/ARMmbed/mbedtls/blob/development/CMakeLists.txt#L237