首页 > 解决方案 > Valgrind 失败不会失败 CTest

问题描述

我正在努力为我的 travis 构建添加内存检查测试。

通常我用ctest --verbose. 我得到了一个很好的输出:

2: [ RUN      ] ContainsNoneTest.GivenSomeOfTheValuesShouldReturnFalse
2: [       OK ] ContainsNoneTest.GivenSomeOfTheValuesShouldReturnFalse (0 ms)
2: [----------] 4 tests from ContainsNoneTest (0 ms total)
2: 
2: [----------] Global test environment tear-down
2: [==========] 49 tests from 13 test cases ran. (1 ms total)
2: [  PASSED  ] 49 tests.
2/2 Test #2: LangTest .........................   Passed    0.00 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   0.20 sec

现在,我想添加 valgrind。我在其中一种方法中放了一个小泄漏,使用以下命令运行测试ctest --verbose -T memcheck

2: [ RUN      ] ContainsNoneTest.GivenSomeOfTheValuesShouldReturnFalse
2: [       OK ] ContainsNoneTest.GivenSomeOfTheValuesShouldReturnFalse (2 ms)
2: [----------] 4 tests from ContainsNoneTest (8 ms total)
2: 
2: [----------] Global test environment tear-down
2: [==========] 49 tests from 13 test cases ran. (453 ms total)
2: [  PASSED  ] 49 tests.
2/2 MemCheck #2: LangTest .........................   Passed    1.00 sec
2: process test output now: LangTest LangTest
PostProcessTest memcheck results for : LangTest

100% tests passed, 0 tests failed out of 2

Total Test time (real) =   6.56 sec
-- Processing memory checking output:
2/2 MemCheck: #2: LangTest .........................   Defects: 12
MemCheck log files can be found here: ( * corresponds to test number)
/home/rumcajs/CLionProjects/ModernCppChallenge/cmake-build-debug/Testing/Temporary/MemoryChecker.*.log
Memory checking results:
Memory Leak - 12

太棒了,valgrind 检测到了泄漏。不幸的是,该过程以返回码 0 退出(用 选中echo $?)。当检测到泄漏时,有没有办法改变ctest行为以输出非零返回码?正则表达式 stdout 或 valgrind 输出文件似乎不文明和野蛮,我想避免它。

标签: c++cmakevalgrind

解决方案


根据上面的error-exitcode评论,我在我的 travis 脚本中设置了以下内容。

首先,error-exitcode在配置您的 CMake 项目时添加选项:

cmake -D MEMORYCHECK_COMMAND_OPTIONS="--error-exitcode=1 --leak-check=full" $SOURCE

然后进行测试,我运行:

  if ! ctest -D ExperimentalMemCheck --output-on-failure; then
    find Testing/Temporary -name "MemoryChecker.*.log" -exec cat {} +
    exit 1
  fi

额外的findcat位是因为--output-on-failure只显示测试输出,而不是 valgrind 输出。


推荐阅读