如何在GitHub Actions中为macOS和Windows配置CTest内存检查?
在GitHub CI的macOS和Windows上实现内存检查的替代方案
Valgrind仅支持Linux,无法在macOS和Windows上使用,以下是对应平台的替代工具及配置方法,可配合ctest -T memcheck或直接运行检测:
macOS平台
macOS推荐使用AddressSanitizer (ASAN),它是Clang(Xcode自带)内置的内存检测工具,无需额外安装,可直接配合CMake和ctest使用:
- CMake配置:在构建前添加ASAN编译选项
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CXX_FLAGS="-fsanitize=address -fno-omit-frame-pointer" \ -DCMAKE_C_FLAGS="-fsanitize=address -fno-omit-frame-pointer" - 构建并运行memcheck:
CMake会自动将ASAN作为cmake --build build ctest -T memcheck -R <test-name> --output-on-failurememcheck的后端,检测结果会直接输出到控制台。
Windows平台
Windows下有两种常用方案,均支持配合ctest或直接检测:
方案1:AddressSanitizer (ASAN)
MSVC 2019及以上版本自带ASAN,GitHub CI的Windows runner已预装MSVC,无需额外安装:
- CMake配置:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_CXX_FLAGS="/fsanitize=address /Zi" \ -DCMAKE_C_FLAGS="/fsanitize=address /Zi" \ -DCMAKE_EXE_LINKER_FLAGS="/INCREMENTAL:NO" - 构建并运行memcheck:
也可以先设置环境变量开启泄漏检测:cmake --build build ctest -T memcheck -R <test-name> --output-on-failure$env:ASAN_OPTIONS = "detect_leaks=1"
方案2:Dr. Memory
如果需要更针对性的Windows内存检测,可使用Dr. Memory,需先安装:
- 安装Dr. Memory(通过Chocolatey):
choco install drmemory -y - 配置CMake使用Dr. Memory作为memcheck工具:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug \ -DMEMORYCHECK_COMMAND="C:/Program Files/Dr. Memory/bin/drmemory.exe" \ -DMEMORYCHECK_COMMAND_OPTIONS="--" - 运行memcheck:
也可以直接用Dr. Memory运行测试程序:cmake --build build ctest -T memcheck -R <test-name> --output-on-failuredrmemory -- .\build\<path-to-test-executable>
跨平台CMake配置建议
为了简化CI步骤,可在CMakeLists.txt中添加条件判断,自动为不同平台配置内存检测选项:
if(CMAKE_BUILD_TYPE STREQUAL "Debug") if(CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID MATCHES "GNU") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address /Zi") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address /Zi") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /INCREMENTAL:NO") endif() endif()
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

