Visual Studio 中使用 AddressSanitizer 指南

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…