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

Windows下Address Sanitizer无输出且lsan_is_turned_off问题求助

Windows下Clang Address Sanitizer(ASAN)内存泄漏检测问题解决

问题原因分析

Windows平台上Clang的ASAN内存泄漏检测(LSAN)存在几个关键限制:

  • 静态链接ASAN时,LSAN默认无法启用(LSAN依赖动态加载组件)
  • 环境变量ASAN_OPTIONS必须在运行程序前正确设置,而非编译阶段
  • 程序需通过正常路径退出(如return 0),若用_exit、TerminateProcess会跳过LSAN的泄漏扫描
  • LLVM 14以下版本对Windows ASAN的LSAN支持不完善

解决步骤

  1. 升级LLVM版本:使用LLVM 14及以上版本,Windows上的ASAN LSAN支持在该版本后才稳定
  2. 优先使用动态链接ASAN:静态链接在Windows上不支持LSAN,必须采用动态链接模式
  3. 正确设置环境变量:
    运行程序前执行:
    set ASAN_OPTIONS=detect_leaks=1
    set LSAN_OPTIONS=verbosity=1  # 可选,用于调试LSAN状态
    
  4. 确保程序正常退出:避免使用_exit()、abort()等强制退出函数,用return 0结束main函数

可用Makefile示例

动态链接版本(推荐,支持LSAN)

# 动态链接ASAN的Makefile
CC = clang++
CFLAGS = -g -fsanitize=address -shared-libasan
LDFLAGS = -fsanitize=address -shared-libasan
TARGET = test_asan_dynamic

all: $(TARGET)

$(TARGET): main.cpp
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

clean:
	del /Q $(TARGET).exe *.pdb

静态链接版本(仅支持ASAN越界检测,不支持LSAN)

# 静态链接ASAN的Makefile(无LSAN支持)
CC = clang++
CFLAGS = -g -fsanitize=address -static-libasan
LDFLAGS = -fsanitize=address -static-libasan
TARGET = test_asan_static

all: $(TARGET)

$(TARGET): main.cpp
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

clean:
	del /Q $(TARGET).exe *.pdb

测试用main.cpp(含内存泄漏)

#include <iostream>

int main() {
    // 故意创建内存泄漏:new的int数组未delete
    int* leak_ptr = new int[10];
    leak_ptr[0] = 42;
    std::cout << "Leak created: " << leak_ptr[0] << std::endl;

    // 正常退出,确保LSAN能扫描
    return 0;
}

运行验证步骤

  1. 编译动态链接版本:make -f Makefile.dynamic
  2. 设置环境变量:
    set ASAN_OPTIONS=detect_leaks=1
    
  3. 运行程序:test_asan_dynamic.exe
  4. 此时应能看到ASAN输出内存泄漏的详细报告,包括泄漏地址、分配栈等信息

内容的提问来源于stack exchange,提问作者BaraNot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:18:14