Comment faire en sorte que ctest exécute un programme avec valgrind sans fléchette?

Je veux écrire un CMakeLists.txt afin que je puisse exécuter mes tests normalement ou avec valgrind. J'ai beaucoup vu sur l'intégration de ctest avec valgrind, mais tous avec l'hypothèse que vous voulez configurer un serveur pour soumettre les résultats des tests à un tableau de bord dart. Je veux juste faire des tests sur ma machine et voir les résultats sur la ligne de commande.

Si je dois faire un cmake-d VALGRIND = sur c'est bien, mais je préfère générer des tests nommés " foo "et" valgrind_foo " si possible.

22
demandé sur leif 2012-02-16 04:15:58

3 réponses

J'utilise valgrind pour ma vérification de la mémoire. Pour configurer valgrind, je définis les variables suivantes dans mon système de construction:

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

Aussi, il y a mon fichier de suppression valgrind:

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

Après avoir écrit vos CMakeLists.les fichiers txt et configurer valgrind correctement, vous pouvez exécuter la commande suivante:

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)

Cela va tromper votre système de construction pour exécuter l'automatisation de test localement. Il s'attend à ce que vous couriez:

ctest -R testName -D ExperimentalSubmit

Ensuite, pour soumettre à la (par défaut ou votre) Tableau de bord, mais vous n'avez pas besoin de passer par cette étape pour exécuter ce que vous voulez. Les résultats seront stockés dans le Test/Temporaire/ répertoire.

22
répondu KlingonJoe 2016-10-30 03:58:44

Il semble que ce qui suit soit suffisant. Je n'utilisais pas separate_arguments avant, c'était ma stupidité.

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)
6
répondu leif 2012-02-16 01:07:20

Mon cas était assez simple que je viens d'utiliser une cible personnalisée:

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()
0
répondu Ben 2016-12-31 19:35:54