選單

為XBox開發者提供的ASan早期釋出版本

本文來自XBox Advanced Technology Group (ATG)的首席軟體工程師Tad Switf。

介紹

Address Sanitizer (ASan) 是一款用來查詢難以追蹤的記憶體相關Bug的利器。自從Visual Studio 16。9中的MSVC釋出開始,我們一直和我們的合作伙伴一起並肩工作,目標是將ASan這個工具帶到XBox平臺。

隨著最近釋出的XBox六月GDK,我們很高興地宣佈:Address Sanitizer的早期釋出版本正式可用。

在今天的這邊文章中,我們將會展示如何在XBox平臺上使用ASan工具。

使用Address Sanitizer進行編譯

在XBox工程上配置ASan基本和PC版本一致,因為Address Sanitizer已經被整合進Visual Studio的除錯工具集中了。但是,對於XBox開發者來說,還是會有一些特殊的場景是預設配置下的ASan所不能支援的。

為XBox開發者提供的ASan早期釋出版本

現代遊戲由高度複雜的多執行緒程式碼組成,其目標是在保持目標幀速率的同時儘可能快地執行。 這意味著,透過自動化構建和測試設定的全過程中,開發人員會經常需要測試自己的程式碼。 這些伺服器可以構建程式碼,將其部署到控制檯,並在沒有偵錯程式連線的情況下運行遊戲,這意味著它們可能會錯過除錯輸出中顯示的任何ASan相關的錯誤報告。理想情況下,測試伺服器可以從任何 Asan 錯誤中收集故障資訊,但由於XBox GDK的差異,必須採取額外的步驟從自動執行中提取Address Sanitizer 的故障資訊。

增強的除錯支援

MSVC的ASan實現可以建立包含詳細異常資訊的故障轉儲,但這隻能從XBox不支援的環境變數中啟用。為了能夠在XBox上獲取故障轉儲,開發人員必須在其程式碼中指定一個函式來提供轉儲檔名。

以下是關於這個函式的兩個例子:

為XBox開發者提供的ASan早期釋出版本

關於這個函式的返回的名稱,系統沒有具體的要求,但它必須是執行程式碼的目標裝置上的一個有效檔案路徑。

既然我們可以在Xbox上支援故障轉儲,我們還決定為開發人員提供更多的靈活性,來處理所產生的故障轉儲型別。

在某些情況下,簡單的”分類”轉儲足以檢視程序失敗的呼叫堆疊,但在遊戲中,通常需要在問題發生時檢視更多記憶體地址空間裡的資料。為此,我們提供了三種可配置的故障轉儲型別,它們受XBox平臺支援,並且與開發人員期望從他們的XBox遊戲機獲得的故障轉儲相匹配。

請注意:與之前的功能一樣,這個配置在XBox上是可選的,但如果你想使用故障轉儲來收集ASan資訊而不附加偵錯程式,則我們強烈建議你這樣做。 如果你提供轉儲檔名但未提供轉儲型別配置,則它將無法在XBox上生成有效的故障轉儲檔案。

此回撥函式返回一個數字以指示所需的轉儲型別。有效型別列表,如下圖所示:

為XBox開發者提供的ASan早期釋出版本

這兩個回撥函式都可以在Visual Studio 16。9。8、16。10。2 或即將釋出的16。11預覽版中找到。

例子程式碼

下面的例子程式碼,演示了將這些函式新增到現有程式碼庫中,我們可以根據需要進行調整,如下圖所示:

為XBox開發者提供的ASan早期釋出版本

請使用如下的命令進行編譯:

這段程式碼在執行的時候,應該會丟擲一個ASan異常,併產生我們上面函式指定的故障轉儲檔案。

你可以將這些功能整合到現有程式碼中,並生成你需要的故障轉儲。

總結

Address Sanitizer現在可在XBox上使用了,開發人員可以利用這項強大的技術,來幫助除錯遊戲中的記憶體問題。

而對於記憶體相關的Bug,確實十分難以除錯,所以,請善用ASan,讓生活變得容易一些。

為XBox開發者提供的ASan早期釋出版本

最後

Microsoft Visual C++團隊的部落格是我非常喜歡的部落格之一,裡面有很多關於Visual C++的知識和最新的開發進展。大浪淘沙,如果你對Visual C++這門古老的技術還是那麼感興趣,則可以經常去他們那(或者我這)逛逛。

本文來自:《Address Sanitizer Now in “Early Release” for Xbox Developers》

最近我寫了個東西

正如你們所知道的,拓撲梅爾智慧辦公平臺(Topomel Box)是一款綠色軟體,主要面向經常使用電腦的朋友。它提供了各種提升辦公效率的小功能,同時操作上儘可能地簡單方便。

我想:你值得擁有。

為XBox開發者提供的ASan早期釋出版本