web-dev-qa-db-ja.com

ダーツなしでvalgrindを使用してctestでプログラムを実行するにはどうすればよいですか?

テストを通常どおりまたはvalgrindで実行できるように、CMakeLists.txtを作成したいと思います。 ctestとvalgrindの統合については多くのことを見てきましたが、すべて、テスト結果をDartダッシュボードに送信するようにサーバーをセットアップすることを前提としています。自分のマシンでテストを実行し、コマンドラインで結果を確認したいだけです。

Cmake -D VALGRIND = ONを実行する必要がある場合は問題ありませんが、可能であれば「foo」および「valgrind_foo」という名前のテストを生成したいと思います。

25
leif

メモリチェックに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 /ディレクトリに保存されます。

25
KlingonJoe

以下で十分のようです。以前は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)
6
leif

私のケースは非常に単純だったので、カスタムターゲットを使用しました。

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
Ben

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

0
Cédric