Visual Studio 中使用 AddressSanitizer 指南

基于 Microsoft Visual Studio 2022,支持 MSVC 和 Clang 编译器链,本文详细说明如何在 VS 中配置和使用 AddressSanitizer,用于检测内存误用,如消息释放后访问、超界读写等类型错误。


一、ASan 是什么?

AddressSanitizer (ASan) 是一个轻量级的内存检测器,用于在运行时检测:

  • 访问已释放的内存 (Use-after-free)
  • 堆/栈/全局超界读写 (Buffer overflow)
  • 未初始化内存访问
  • Double free / 内存泄漏

ASan 实际上是编译器打表 + 扩展运行时加载组成,这需要对应的编译器支持。


二、安装 AddressSanitizer 支持

重点:VS2022 配置项

  1. 打开 Visual Studio Installer

  2. 点击“修改”已安装的 VS 版本

  3. 搜索 AddressSanitizer,勾选 C++ AddressSanitize 组件

  4. (选填) 勾选 Clang Toolchain:

    • “适用于 Windows 的 C++ Clang 编译器”
    • “LLVM(clang-cl) 工具集”

如果未安装该组件,MSVC 无法使用 /fsanitize=address 选项!

在这里插入图片描述
在这里插入图片描述


三、Visual Studio 中的两种工具链

在 Visual Studio 中可以选择使用:

工具链描述
MSVC(默认)微软自研编译器,性能好,兼容性强
Clang/LLVMClang 编译器,支持更强的诊断能力和 ASan

若希望启用 AddressSanitizer,推荐使用 Clang 工具链(clang-cl)


四、MSVC 编译器下启用 ASan

  1. 使用 MSVC (Visual Studio 默认)
  2. 项目属性中设置:

(注意配置 Debug / x64)

  • C/C++ -> 调试信息格式 设置为 程序数据库 (/Zi)

  • C/C++ -> 全局选项 设置:

    • 启用地址清理系统是 (/fsanitize=address)
    • 优化已禁用 (/Od)
  • 链接器 -> 生成调试信息/DEBUG

在这里插入图片描述

❗备注:实际上现在已经支持 x64Release 版本,所以调试信息、优化等默认即可。

示例代码

#include <iostream>int main()
{int* p = new int(123);std::cout << *p << std::endl;   // 正常访问内存delete p;                       // 释放内存std::cout << *p << std::endl;   // 悬空指针访问,应该触发 ASan 报错std::cin.get();                 // 等待输入,保持控制台窗口return 0;
}

运行后输出:

在这里插入图片描述

运行时:

  • 不要用 F5 (调试)
  • 请使用 Ctrl + F5 (开始执行,不调试)

注意:千万不要使用调试(F5)。


五、MFC / 图形界面程序中查看 AddressSanitizer 输出

AddressSanitizer(ASan)默认将检测信息通过控制台(标准输出)打印出来。但对于 MFC、Qt 等图形界面程序,Visual Studio 默认构建为 “Windows 子系统”,是不显示控制台窗口的,导致你可能根本看不到报错信息。

✅ 解决方式一:手动打开控制台窗口

可以在程序入口初始化时调用以下代码,手动打开一个控制台窗口,接收 ASan 的输出:

#include <windows.h>
#include <iostream>void EnableConsole()
{AllocConsole();FILE* pCout;freopen_s(&pCout, "CONOUT$", "w", stdout);freopen_s(&pCout, "CONOUT$", "w", stderr);freopen_s(&pCout, "CONIN$", "r", stdin);std::ios::sync_with_stdio();std::cout.clear();std::cerr.clear();std::cin.clear();
}

然后在 InitInstance()(MFC)或 main() 中调用:

EnableConsole();

✅ 解决方式二:在命令行中运行 GUI 程序

你也可以通过命令行(如 PowerShell、CMD)进入程序目录,直接运行程序:

cd D:\WorkCode\MyApp\bin\x64\Debug
MyApp.exe

控制台会输出 AddressSanitizer 的详细错误信息(含堆栈地址)。


六、Clang Toolchain 注意事项

VS 支持 Clang-cl 实现简单 ASan 分析,但有些限制:

  • 需要自己配置 ASAN_SYMBOLIZER_PATH
  • Clang 进程运行时无法读取原始 PDB 路径
  • 无法完整显示 free 时的堆栈调用栏

现阶段下,建议先使用 MSVC + ASan 进行调试


七、数据解码 symbolizer 应用

如果看到:

WARNING: Failed to use and restart external symbolizer!
AddressSanitizer can not provide additional info.

说明未连接到 symbolizer,需要设置环境变量:

ASAN_SYMBOLIZER_PATH="C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\Llvm\x64\bin\llvm-symbolizer.exe"

注意是 exe 路径,且 VS 需要重新打开以便环境变量生效

可选配置:

ASAN_OPTIONS=fast_unwind_on_malloc=0:verbosity=1

八、Clang vs MSVC:使用体验差异

对比项MSVC 工具链Clang 工具链
是否支持 AddressSanitizer❌ 部分支持(需其他手段)✅ 原生支持
调用栈符号是否完整❌(需配合符号服务器)✅(配合 llvm-symbolizer)
是否支持释放位置追踪✅(前提是配置正确)
调试体验VS 原生调试器佳调试信息略难查看

注意:当前 Visual Studio + Clang-cl 工具链下的 ASan 功能仍有局限,例如释放堆栈无法完整显示(除非使用原生 clang++ 工具链和 CMake 工程)。


九、Clang 工具链支持现状

虽然 ASan 支持 Clang,但在 Windows 上使用 LLVM (clang-cl) 工具集时,当前版本的 Visual Studio 中 并不能很好地兼容 symbolizer 输出

当前问题:

  • 报错时能捕捉越界或悬空指针问题,但栈信息无法正常符号化。
  • ASAN_SYMBOLIZER_PATH 设置无效或无触发。

原因:

MSVC 的 asan_runtime 模块在内部链接时处理了符号信息传递,而 clang-cl 的 runtime 在 Windows 下并未完整实现符号解析。

建议:

  • 如果追求准确堆栈,建议当前仍使用 MSVC 工具集进行分析。
  • 可关注 LLVM for Windows 后续进展,或在 WSL/Linux 环境下使用 Clang + ASan。

十、官方参考文档

  • ASan for Windows (MSVC) 介绍 - Microsoft DevBlog
  • ASan 支持 x64 和 Debug 配置 - VS 16.9 Preview
  • MS Learn 文档:ASan 使用指南

小结

目标建议设置
快速检测内存误用MSVC + AddressSanitizer
需要释放类调用堆栈原生 clang++ + CMake + symbolizer
文件细节 symbol设置 ASAN_SYMBOLIZER_PATH

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88440.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88440.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88440.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink Sink函数深度解析:从原理到实践的全流程探索

在Flink的数据流处理体系中&#xff0c;Sink函数作为数据处理的最终出口&#xff0c;肩负着将处理后的数据写入外部存储引擎的关键使命。它如同数据旅程的终点站&#xff0c;决定着数据的最终归宿与应用价值。深入理解Sink函数的工作原理、核心概念及实现方式&#xff0c;对构建…

Codex+ 自建中转 API 部署教程(Windows 版)

&#x1f4cc; 一、前置环境准备 安装 Node.js 和 Codex CLI&#xff1a; npm install -g openai/codex准备 OpenAI API Key 确保你已有的中转接口兼容 OpenAI 格式&#xff0c; &#x1f4cc; 二、设置 PowerShell 环境变量 # 设置你的 API Key&#xff08;使用哪家的看你的…

Centos 7离线部署Nginx 高效省时

给脚本执行权限&#xff1a;chmod x install_nginx.sh以root用户运行&#xff1a;sudo ./install_nginx.sh 脚本如下&#xff1a; #!/bin/bash # Nginx一键化部署脚本&#xff08;修复版本开机自启&#xff09; # 需要以root权限运行set -e # 任何命令失败时立即退出脚本# 定…

P7915 [CSP-S 2021] 回文

题目描述 给定正整数 n n n 和整数序列 a 1 , a 2 , … , a 2 n a_1, a_2, \ldots, a_{2 n} a1​,a2​,…,a2n​&#xff0c;在这 2 n 2 n 2n 个数中&#xff0c; 1 , 2 , … , n 1, 2, \ldots, n 1,2,…,n 分别各出现恰好 2 2 2 次。现在进行 2 n 2 n 2n 次操作&#xf…

小智AI -- ESP32-S3 DIY面包板WIFI-LCD彩屏

DIY 所需硬件 开发板&#xff1a;ESP32-S3-DevKitC-1&#xff08;选择 WROOM N16R8 模组&#xff09; Goouuu ESP32-S3-N16R8开发板数字麦克风&#xff1a;INMP441 INMP441全向麦克风模块功放&#xff1a;MAX98357A MAX98357 I2S 音频放大器模块腔体喇叭&#xff1a;8Ω 2~3W 或…

家用网络进行DNS优选

家用网络进行DNS优选的好处主要体现在以下几个方面&#xff1a; 提升网络访问速度&#xff1a; DNS优选通过选择响应时间更快的DNS服务器&#xff0c;减少域名解析的延迟&#xff0c;从而加快网页加载和应用访问速度。尤其在访问国内外网站时&#xff0c;选择合适的DNS服务器可…

刷题 | 牛客 - js中等题-下 (更ing)45/54知识点解答

JS45 数组去重 描述 为 Array 对象添加一个去除重复项的方法 示例1 输入&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a, a, NaN] 复制输出&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a] Array.prototype.uniq function () …

vue3使用krpano1.22

官方文档链接 https://krpano.com/docu/js/#top 例子 https://krpano.com/releases/1.22/viewer/examples/javascript-interface/js-api-examples.html https://krpano.com/viewsource.html?releases/1.22/viewer/examples/javascript-interface/js-api-examples.html 注…

2025年AI面试推荐榜单,数字化招聘转型优选

一、AI面试为何成为2025招聘标配&#xff1f; 2025年企业对AI面试的需求从“效率工具”升级为“战略级招聘伙伴”。数据显示&#xff0c;超7成企业计划年内全面引入AI面试&#xff0c;其中技术岗、全球化招聘及蓝领用工场景需求增速显著。以下以综合技术实力、行业口碑及落地能…

人机协作新篇章:艾利特按摩机器人如何重塑健康生活

引言&#xff1a;按摩机器人的需求爆发 在快节奏的现代生活中&#xff0c;亚健康人群比例持续攀升。据《全球健康产业白皮书》显示&#xff1a; 85%的都市人群存在肌肉劳损问题专业理疗师供需缺口达1&#xff1a;3200精准按摩服务成本年均增长18% 这一背景下&#xff0c;按摩…

从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版

文章目录 前言1. 加载与预处理数据集数据读取与词元化构建词汇表截断、填充与数据迭代器2. 构建循环神经网络模型双向RNN模型(BiRNN)详解权重初始化3. 加载预训练词向量构建词向量加载器将预训练向量注入模型4. 训练与评估模型定义训练函数可视化训练过程5. 模型预测编写预测…

化于无形的 lambda 语法

针对数据集合的每个成员进行计算是很常见的任务&#xff0c;用循环语句当然能实现&#xff0c;但比较麻烦&#xff0c;算个简单的求和都要写很多句代码。 编程语言经常把这些运算封装成函数&#xff0c;比如 Python 的 sum 函数&#xff0c;求订单价格总和是这样写的&#xff…

day42

1. 回调函数&#xff1a;把一个函数当成“任务清单”交给另一个函数&#xff0c;等后者干完活&#xff0c;就按清单执行这个函数。比如点外卖后留电话&#xff0c;骑手送到了就打电话&#xff08;执行回调&#xff09;通知你。 2. lambda函数&#xff1a;临时写的超短函数&…

百度日志中台前端重构实践

日志中台是百度内部针对打点数据的全生命周期管理平台&#xff0c;作为公司日志数据的唯一入口&#xff0c;承担以下核心职能&#xff1a;1.功能覆盖&#xff1a;提供从数据采集、传输、存储到查询分析的一站式服务&#xff0c;支持产品运营分析、研发性能监控、运维管理等多元…

資訊安全 (Information Security)3大 “CIA“要素

資訊安全之3大要素&#xff0c;業界慣用"CIA"稱之&#xff0c;包括機密性 (Confidentiality)、完整性(Integrity)與可用性(Availability)&#xff1b;更應增加諸如鑑別性、可歸責性、不可否認性與可靠性。 1.機密性 (Confidentiality) 機密性是指採用適當的安全機制…

php后台增加权限控制

背景 最近在对接某大厂&#xff0c;部署差不多了&#xff0c;但是在漏洞扫描环节有问题&#xff0c;前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问&#xff0c;很危险 解决方法 一、创建 Auth 中间件 首先创建一个专门…

跨平台后端编程ASP.NET CORE Razor新一代Web开发框架C#

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗&#xff1f; https://blog.csdn.net/xiaoyao961/article/details/148846065 C#Blazor应用-跨平台WEB开发VB.NET-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148846437 Products.razor文件,Blazor和…

Storm-Pulse 全国强对流预报接口深度解析:从技术原理到防灾应用(附API接入示例)

2025年6月14日安徽省气象台发布的强对流黄色预警中&#xff0c;合肥、阜阳等地出现了小时雨量 30-50 毫米的短时强降水和8-10级雷暴大风&#xff0c;局地甚至观测到云闪现象。强对流天气是指由强烈上升气流引发的突发性、高破坏力天气现象&#xff0c;涵盖了短时强降水、雷暴大…

2024中国科学技术大学计算机保研上机真题

中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem 运动会比赛日程安排 题目描述 某运动会设立 M M M 个比赛项目&#xff0c;每个运动员&#xff08;共 N N N 个运动员&#xff09;可以参加多个项目&#xff0c;每个项目的比赛时长…

(LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)

题目&#xff1a;122. 买卖股票的最佳时机 II 思路&#xff1a;贪心&#xff0c;时间复杂度0(n)。 当天比前一天值大&#xff0c;就进行卖出的交易。购入是默认前一天已购入。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int…