c++ - 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 输出文件似乎不文明和野蛮,我想避免它。
解决方案
根据上面的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
额外的find
和cat
位是因为--output-on-failure
只显示测试输出,而不是 valgrind 输出。
推荐阅读
- php - Laravel:同一张桌子上的关系
- javascript - 无法在选择框中选择值
- ruby - 如何测试线程
- java - notifyDataSetChanged 在适配器上不起作用
- json - 用 JSONPath 提取整个 JSON?
- c++ - 分段错误 - 读取初始化指针数组
- django - 如何在 django 中为我的产品模型上传多个图像?
- c# - 用户是否可以转义 asp.net core 的应用程序文件夹?
- facebook - 通过 Facebook 广告获取 Branch 的 Deeplink 键值
- visual-studio - 使用 xam.Plugin.DownloadManager Xamarin 表单