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支持不完善
解决步骤
- 升级LLVM版本:使用LLVM 14及以上版本,Windows上的ASAN LSAN支持在该版本后才稳定
- 优先使用动态链接ASAN:静态链接在Windows上不支持LSAN,必须采用动态链接模式
- 正确设置环境变量:
运行程序前执行:set ASAN_OPTIONS=detect_leaks=1 set LSAN_OPTIONS=verbosity=1 # 可选,用于调试LSAN状态 - 确保程序正常退出:避免使用
_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; }
运行验证步骤
- 编译动态链接版本:
make -f Makefile.dynamic - 设置环境变量:
set ASAN_OPTIONS=detect_leaks=1 - 运行程序:
test_asan_dynamic.exe - 此时应能看到ASAN输出内存泄漏的详细报告,包括泄漏地址、分配栈等信息
内容的提问来源于stack exchange,提问作者BaraNot
相关产品推荐
相关产品推荐

