如何在VSCode中正确使用-fsanitizer编译C++并解决-lasan报错
VSCode 中正确使用 fsanitize 定位内存问题的方法
报错根因
你碰到的cannot find -lasan报错和VSCode本身没有任何关系,核心原因是你当前使用的msys2源里的x86_64-w64-mingw32版本GCC,默认没有编译打包AddressSanitizer(也就是asan)的运行库,链接阶段找不到对应依赖,不管你怎么调整编译参数顺序、加什么路径配置,都解决不了问题。
注意:开ASAN检测的时候不要用
-O2优化等级,优化级别过高会导致ASAN的错误栈回溯、问题行号定位失效,推荐用-O0或者-O1,同时加上-g参数保留调试符号,定位问题更准确。
具体解决步骤
方案1:替换为支持ASAN的编译器(最推荐,检测效果最好)
直接把当前不支持ASAN的GCC换成Windows平台原生支持ASAN的clang编译器,操作很简单:
- 打开msys2的终端,执行命令卸载原来的mingw64 GCC,安装clang:
pacman -R mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-clang
- 确认系统环境变量里msys64的mingw64/bin路径优先级最高,新开终端输入
clang++ --version能正常输出版本号就说明安装成功。 - 编译的时候把原来的g替换成clang,带上fsanitize参数即可:
clang++ -std=c++17 -O1 -Wall -g -fsanitize=address tempCodeRunnerFile.cpp -o tempcodeRunnerfile.exe
- 编译完成后直接在终端运行生成的exe,触发内存越界、野指针、内存泄漏等问题时,ASAN会直接把错误类型、问题位置、完整调用栈打印在终端里,不需要额外配置VSCode的调试功能。
如果你平时用VSCode的Code Runner插件一键编译运行,直接打开插件的executorMap配置项,把C对应的编译命令替换成上面带fsanitize参数的clang命令就行,后续点运行按钮就能自动触发带ASAN检测的编译流程,报错信息直接输出在VSCode终端面板。
方案2:不换编译器的替代方案
如果你不想替换现有GCC环境,就没必要硬凑ASAN,直接用兼容现有MinGW的内存检测工具即可:
- 编译时加
-g参数保留调试符号,用Dr.Memory这类工具加载运行生成的exe,同样可以定位内存泄漏、越界问题,只是检测速度和精度比ASAN稍差。
内容的提问来源于stack exchange,提问作者itti_da
相关产品推荐
相关产品推荐

