web-dev-qa-db-ja.com

cmake "test"ターゲットにvalgrindテストを追加する方法

ninjaでビルドしてユニットテストを実行し、ビルドツリーからninja testを実行します。

cmake -G Ninja /source/tree
ninja
ninja test

ただし、valgrindを実行するには、手動で実行する必要があります。

valgrind rel/path/to/test

ninja testを実行すると、valgrindが自動的に実行されます。 cmakeのドキュメントによると "[valgrindテスト]のセットアップは非常に簡単です"、しかし私が走るとき

ctest -D NightlyMemoryCheck

私はこのエラーを受け取ります:

Cannot find file: /home/arman/tinman/deb/DartConfiguration.tcl
   Site: 
   Build name: (empty)
WARNING: No nightly start time found please set in CTestConfig.cmake or DartConfig.cmake
Problem initializing the dashboard.

このSO質問の指示に従うと、同様のエラーが発生します。

dartなしでvalgrindを使用してctestを実行するにはどうすればよいですか?

Dartが何であるかはわかりませんが、ウェブサイトによると、それはある種のオンラインテストの間違いです。

明らかに非常に簡単は私には十分簡単ではありません。非常に簡単なソリューションを知っている人はいますか?それを機能させるにはITウォーロックのようなものでなければなりません

23
quant

これは、valgrindテストをCMakeプロジェクトに追加する方法を示す自己完結型の例です。この例は、単一のC++ソースファイル_main.cpp_で構成されています。

_#include <iostream>

int main()
{
    double* leak = new double[10];
    std::cout << "Hello!" << std::endl;
}
_

コードには、valgrindによって検出される意図的なリークが含まれています。また、CMake> = 2.8を必要とする_CMakeLists.txt_ファイルも必要です。

_cmake_minimum_required(VERSION 2.8)

project (ValgrindExample)

include (CTest)
add_executable(example main.cpp)
add_test(example_test example)
_

ここでは、enable_testing()でテストを有効にするだけでなく、includeでCTestモジュールを含めることが重要です。 CTestモジュールは、テストでメモリチェックを実行できるように機構を設定します(たとえば、valgrind実行可能ファイルを見つけます)。

これで、プロジェクトフォルダーでシェルセッションを開き、忍者ビルドツリーを作成できます。

_$ mkdir build; cd build
$ cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug ..
_

通常の方法でテストをビルドして実行できますwithout valgrind:

_$ ninja
[2/2] Linking CXX executable example
$ ninja test
[0/1] Running tests...
...
100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.01 sec
_

テストを実行するにはwith valgrindで、CMakeのctest実行可能ファイルをテストアクションmemcheckで使用する必要があります。

_$ ctest -T memcheck
...
1/1 MemCheck #1: example_test .....................   Passed    0.77 sec

100% tests passed, 0 tests failed out of 1

Total Test time (real) =   0.77 sec
-- Processing memory checking output: 
Memory checking results:
Memory Leak - 2
_

ctestは、メモリチェック結果の概要を出力します。 valgrindの詳細な出力は、ビルドツリーの一時ディレクトリにあります。

_$ cat ./Testing/Temporary/MemoryChecker.*.log
==4565== 80 bytes in 1 blocks are definitely lost in loss record 37 of 64
==4565==    at 0x10000B681: malloc (in /usr/local/Cellar/valgrind/3.12.0/lib/valgrind/vgpreload_memcheck-AMD64-darwin.so)
==4565==    by 0x1000507DD: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==4565==    by 0x100000F93: main (main.cpp:5)
...
_

CMakeの組み込みテストターゲットは変更できず、常に通常の方法でテストを実行するため、_ninja test_を実行するときにvalgrindを自動的に実行することはできません。ただし、_-T memcheck_オプションを指定してctestを呼び出し、詳細なvalgrindレポートを出力するカスタムCMakeターゲットを追加できます。

_add_custom_target(test_memcheck
    COMMAND ${CMAKE_CTEST_COMMAND} 
        --force-new-ctest-process --test-action memcheck
    COMMAND cat "${CMAKE_BINARY_DIR}/Testing/Temporary/MemoryChecker.*.log")
_

_--test-action_は、スイッチの詳細バージョン_-T_です。

次に、Ninjaからvalgrindテストを呼び出すことができます

_$ ninja test_memcheck
_

valgrindを手動で実行したかのように結果を取得します。

38
sakra