AddressSanitizer 雲端或分散式測試

您不需要在發生 AddressSanitizer 錯誤的時間和位置進行偵錯。 設定執行時間以建立當發生錯誤時儲存所有 AddressSanitizer 特定內容的損毀傾印。 然後將該損毀傾印傳送至另一部電腦以進行偵錯。 在雲端或分散式測試中執行 AddressSanitizer 時,離線偵錯可能是關鍵時間。 您可以在發生失敗的測試或生產基礎結構上建立傾印,並在稍後在開發人員電腦上進行偵錯。

Visual Studio 偵錯工具提供精確診斷的 AddressSanitizer 錯誤。 您可以檢視這些 Bug,而不需要重新執行測試、複製大型資料集、探索遺失的資料,或尋找離線的測試機器。 您只需要載入損毀傾印。

設定下列環境變數,會在 AddressSanitizer 失敗時建立損毀傾印:

set ASAN_SAVE_DUMPS=MyFileName.dmp

注意

檔案名必須具有尾碼 .dmp ,才能遵循 Visual Studio 命名慣例。

您可以在稍後在另一部電腦上使用 Visual Studio 來顯示此 傾印檔案

Visual Studio 可以在原始原始程式碼的內容中顯示錯誤資訊。 若要這樣做,Visual Studio 需要 偵錯符號 已編制索引的原始程式碼 。 為了獲得最佳偵錯體驗,用來產生這些二進位檔的 EXE、PDB 和原始程式碼必須相符。

如需儲存來源和符號的詳細資訊,請參閱 來源和符號 一節。 如需實作詳細資料和精細控制項的相關資訊,請參閱 偵錯工具整合

範例 - 建置、測試和分析

請考慮三部機器:A、B 和 C.建置是在機器 B 上完成,測試是在電腦 C 上執行,而且您分析機器 A 上的失敗。這些錯誤會針對原始程式碼中的源行和資料行編號報告。 您可以在使用該 確切原始程式碼版本 所產生的 PDB 檔案中,一起查看呼叫堆疊與一組符號。

下列步驟適用于導致建立 .dmp 檔案的本機或分散式案例,以及離線檢視該 AddressSanitizer 傾印檔案。

在本機產生 .dmp

  • 組建
  • 測試可執行檔
  • 將產生的 .dmp 檔案複製到組建目錄
  • 在相同的目錄中,以配對的 .pdb 開啟 .dmp 檔案

在分散式系統上產生 .dmp

  • 建置和 後處理來源索引資料區塊的 PDB
  • 將不可部分完成的組 (.exe, .pdb) 複製到測試機器並執行測試
  • 將 (.pdb, .dmp) 的不可部分完成配對寫入 Bug 報告資料庫
  • Visual Studio 會在相同的目錄中開啟具有配對 .pdb 的 .dmp 檔案

注意

您用於分析的 Visual Studio 2019 機器必須能夠存取 GitHub 或儲存索引來源的內部 \\Machine\share

檢視 AddressSanitizer .dmp 檔案

  1. 請確定偵錯工具 IDE 可以找到您的 PDB 和來源檔案。

  2. 開啟 Visual Studio,然後選取 [ 不使用程式碼 繼續]。 然後選取 [ 檔案 > 開啟 > 檔案 ] 以開啟 [檔案開啟] 對話方塊。 請確定檔案名尾碼為 .dmp

    Screenshot of the File Open File menu in Visual Studio.

    此處顯示的畫面需要再執行一個步驟,才能讓 IDE 存取符號和來源。

  3. 設定符號路徑,然後選擇 [ 原生偵錯]。

    Screenshot of the Minidump Summary display in Visual Studio.

此螢幕擷取畫面顯示最終載入的傾印檔案,並載入來源和 AddressSanitizer 中繼資料。

Screenshot of the debugger showing source files and AddressSanitizer metadata.

來源和符號

來源伺服器可讓用戶端擷 取用來建置應用程式之原始程式檔的確切版本 。 可執行檔或 DLL 的原始程式碼可能會隨著時間,以及版本之間的變更。 您可以使用它來查看建置特定應用程式版本的相同原始程式碼。

使用 PDB 檔案對 EXE 進行偵錯時,偵錯工具可以使用內嵌的來源伺服器資料區塊,從原始檔控制擷取適當的檔案。 它會載入對應至編譯器選項自動放入 PDB 中完整名稱的 /Zi 檔案。

若要使用來源伺服器,應用程式必須使用 將資料區塊寫入 srcsrv PDB 檔案,以「編制來源索引 pdbstr.exe 」。 如需詳細資訊,請參閱來源伺服器和來源索引 一節。 您也會找到 索引來源和發佈符號 的步驟,以及如何 為偵錯工具 指定符號和原始程式碼。

如需外部檔,請參閱:

另請參閱

AddressSanitizer 概觀
AddressSanitizer 已知問題
AddressSanitizer 組建和語言參考
AddressSanitizer 執行時間參考
AddressSanitizer 陰影位元組
AddressSanitizer 偵錯工具整合
AddressSanitizer 錯誤範例