Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 如何使ctest在没有dart的情况下使用valgrind运行程序?_Cmake_Valgrind - Fatal编程技术网

Cmake 如何使ctest在没有dart的情况下使用valgrind运行程序?

Cmake 如何使ctest在没有dart的情况下使用valgrind运行程序?,cmake,valgrind,Cmake,Valgrind,我想写一个CMakeLists.txt,这样我就可以正常运行测试或使用valgrind。我已经看到了很多关于将ctest与valgrind集成的内容,但都是基于这样的假设,即您希望设置一个服务器来将测试结果提交给dart仪表板。我只想在我的机器上运行测试,并在命令行上查看结果 如果我必须做一个cmake-D VALGRIND=就可以了,但是如果可能的话,我宁愿生成名为“foo”和“VALGRIND\u foo”的测试 以下内容似乎足够了。我以前没有使用单独的论点,那是我的愚蠢 function(

我想写一个CMakeLists.txt,这样我就可以正常运行测试或使用valgrind。我已经看到了很多关于将ctest与valgrind集成的内容,但都是基于这样的假设,即您希望设置一个服务器来将测试结果提交给dart仪表板。我只想在我的机器上运行测试,并在命令行上查看结果


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

以下内容似乎足够了。我以前没有使用单独的论点,那是我的愚蠢

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)

我用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/目录中。

我的案例非常简单,我只使用了一个自定义目标:

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()
项目(bftest)
添加可执行文件(bftest main.c)
目标链接库(bftest链接公共bf)
查找程序(VALGRIND“VALGRIND”)
如果(VALGRIND)
添加自定义目标(valgrind)
命令“${VALGRIND}”--tool=memcheck--leak check=yes--show reachable=yes--num callers=20--track fds=yes$)
endif()

您可以使用
添加自定义目标()
生成最小的“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()
希望这有帮助!:-)


信用证:

这似乎比创建实验构建更简单。