Как сделать так, чтобы ctest запускал программу с valgrind без dart? - PullRequest
23 голосов
/ 16 февраля 2012

Я хочу написать CMakeLists.txt, чтобы я мог запускать свои тесты в обычном режиме или с помощью valgrind. Я многое видел при интеграции ctest с valgrind, но все предполагал, что вы хотите настроить сервер для отправки результатов тестирования на панель инструментов dart. Я просто хочу запустить тесты на моей машине и увидеть результаты в командной строке.

Если мне нужно выполнить cmake -D VALGRIND = ON, то это нормально, но я бы лучше сгенерировал тесты с именами "foo" и "valgrind_foo", если это возможно.

Ответы [ 3 ]

23 голосов
/ 23 марта 2012

Я использую 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 /.

6 голосов
/ 16 февраля 2012

Кажется, что следующего достаточно. Раньше я не использовал раздельные аргументы, это была моя глупость.

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)
0 голосов
/ 31 декабря 2016

Мой случай был достаточно прост, поэтому я просто использовал пользовательскую цель:

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()
...