You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中为macOS和Windows配置CTest内存检查?

在GitHub CI的macOS和Windows上实现内存检查的替代方案

Valgrind仅支持Linux,无法在macOS和Windows上使用,以下是对应平台的替代工具及配置方法,可配合ctest -T memcheck或直接运行检测:

macOS平台

macOS推荐使用AddressSanitizer (ASAN),它是Clang(Xcode自带)内置的内存检测工具,无需额外安装,可直接配合CMake和ctest使用:

  1. 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"
    
  2. 构建并运行memcheck:
    cmake --build build
    ctest -T memcheck -R <test-name> --output-on-failure
    
    CMake会自动将ASAN作为memcheck的后端,检测结果会直接输出到控制台。

Windows平台

Windows下有两种常用方案,均支持配合ctest或直接检测:

方案1:AddressSanitizer (ASAN)

MSVC 2019及以上版本自带ASAN,GitHub CI的Windows runner已预装MSVC,无需额外安装:

  1. 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"
    
  2. 构建并运行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,需先安装:

  1. 安装Dr. Memory(通过Chocolatey):
    choco install drmemory -y
    
  2. 配置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="--"
    
  3. 运行memcheck:
    cmake --build build
    ctest -T memcheck -R <test-name> --output-on-failure
    
    也可以直接用Dr. Memory运行测试程序:
    drmemory -- .\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:36