Visual Studio AddressSanitizer 擴充功能程式庫 (VCAsan)

程式庫會在 VCAsan*.lib Visual Studio 中實作擴充偵錯工具 IDE 功能。 這些功能可讓 IDE 在即時偵錯會話中顯示 AddressSanitizer 錯誤,或使用中繼資料儲存損毀傾印檔案而離線。 每當 MSVC 編譯器啟用 AddressSanitizer 時,程式庫就會連結。

VCAsan 程式庫清查

執行時間選項 VCAsan 程式庫
/MT libvcasan.lib
/MD vcasan.lib
/MTd libvcasand.lib
/MDd vcasand.lib

VCAsan 程式庫功能

Visual Studio IDE 中的 Rich AddressSanitizer 錯誤報表視窗

VCAsan 程式庫會使用 介面函 __asan_set_error_report_callback 式,在 AddressSanitizer 執行時間內註冊回呼。 如果產生 AddressSanitizer 報告,此回呼會用來擲回 Visual Studio 所攔截的例外狀況。 Visual Studio 會使用例外狀況資料來產生在 IDE 中向使用者顯示的訊息。

注意

VCAsan 程式庫會在 AddressSanitizer 執行時間中註冊回呼函式。 如果您的程式碼第二次呼叫此註冊函式,則會覆寫 VCAsan 程式庫回呼註冊。 這會導致所有 Visual Studio IDE 整合遺失。 您將還原回預設 IDE 使用者體驗。 使用者呼叫也可以註冊其回呼遺失。 如果您遇到任一問題,請提出 Bug

將 AddressSanitizer 錯誤儲存在新型損毀傾印檔案中

當您將 VCAsan 程式庫連結至可執行檔時,使用者可以讓它在執行時間產生損毀傾印。 然後,當診斷錯誤發生時,AddressSanitizer 執行時間會產生傾印檔案。 若要啟用此功能,使用者會使用如下的命令來 ASAN_SAVE_DUMPS 設定環境變數:

set ASAN_SAVE_DUMPS=MyFileName.dmp

檔案必須具有 .dmp 延伸模組,才能遵循 Visual Studio IDE 慣例。 (17.7之前)

以下是針對 指定 ASAN_SAVE_DUMPS 傾印檔案時所發生的情況:如果 AddressSanitizer 執行時間攔截到錯誤,則會儲存與錯誤相關聯的中繼資料損毀傾印檔案。 Visual Studio 16.9 版和更新版本中的偵錯工具可以剖析儲存在傾印檔案中的中繼資料。 您可以 ASAN_SAVE_DUMPS 根據每個測試設定、儲存這些二進位成品,然後在 IDE 中檢視具有適當來源索引的成品。

Visual Studio 17.7 版和更新版本支援下列各項:

  • 引號字串現在已正確處理。 在舊版中,若是 Visual Studio 內部的環境,或使用 PowerShell 時,將環境變數設定為包含引號或空格,將無法建立預期的傾印檔案。

  • .dmp明確指定延伸模組時(例如 set ASAN_SAVE_DUMPS=MyDmp.dmp ,),VCAsan 會明確使用它,而且不會將相關聯的進程識別碼新增至傾印檔案名。

  • .dmp如果檔案已經存在,且環境變數中指定的名稱相同,VCAsan 會修改檔案名,如下所示:

    • 將數位附加至括弧中的檔案名。 例如: Myfile (1).dmp
    • 如果在括弧中附加數位的幾次嘗試無法產生唯一名稱之後,檔案會儲存到 %APPLOCAL% VCAsan 將列印的暫存路徑。 例如: C:\Users\~\AppData\Local\Temp\Dump.dmp
    • 如果儲存至暫存路徑失敗,則會顯示診斷錯誤。

另請參閱

AddressSanitizer 概觀
AddressSanitizer 已知問題
AddressSanitizer 組建和語言參考
AddressSanitizer 執行時間參考
AddressSanitizer 陰影位元組
AddressSanitizer 雲端或分散式測試
AddressSanitizer 錯誤範例