分享方式:


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

    Visual Studio 中 [檔案開啟檔案] 功能表的螢幕快照。

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

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

    Visual Studio 中顯示迷你傾印摘要的螢幕快照。

此螢幕快照顯示最終載入的傾印檔案,並載入來源和 AddressSanitizer 元數據。

調試程序的螢幕快照,其中顯示來源檔案和 AddressSanitizer 元數據。

來源和符號

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

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

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

如需外部檔,請參閱:

另請參閱

AddressSanitizer 概觀
AddressSanitizer 已知問題
AddressSanitizer 組建和語言參考
AddressSanitizer 運行時間參考
AddressSanitizer 陰影位元組
AddressSanitizer 調試程式整合
AddressSanitizer 錯誤範例