診斷和檢測
原生 AOT 會與 CoreCLR 共用一些診斷和檢測功能,但並非全部。 由於 CoreCLR 具有豐富的診斷公用程式選取項目,因此有時在 CoreCLR 中診斷和偵錯問題會非常合適。 修剪相容的應用程式不應該有行為差異,因此調查通常適用於兩個執行階段。 儘管如此,某些資訊只能在發佈後收集,因此原生 AOT 也會提供發行後診斷工具。
.NET 8 原生 AOT 診斷支援
下表摘要說明原生 AOT 部署支援的診斷功能:
功能 | 完全支援 | 部分支援 | 不支援 |
---|---|---|---|
可檢視性和遙測 | 部分支援 | ||
開發時間診斷 | 完全支援 | ||
原生偵錯 | 部分支援 | ||
CPU 分析 | 部分支援 | ||
堆積分析 | 不支援 |
可檢視性和遙測
原生 AOT 執行階段自 .NET 8 起會支援 EventPipe,這是許多記錄和追蹤程式庫使用的基底層。 您可以直接透過像 EventSource.WriteEvent
的 API 來與 EventPipe 進行連接,或者可以使用建置於頂層的程式庫,如 OpenTelemetry。 EventPipe 支援也可讓例如 dotnet-trace、dotnet-counters 和 dotnet-monitor 的 .NET 診斷工具搭配原生 AOT 或 CoreCLR 應用程式順暢地運作。 EventPipe 是原生 AOT 中的選用性元件。 若要包含 EventPipe 支援,請將 EventSourceSupport
MSBuild 屬性設定為 true
。
<PropertyGroup>
<EventSourceSupport>true</EventSourceSupport>
</PropertyGroup>
原生 AOT 為某些知名的事件提供者提供部分支援。 原生 AOT 不支援所有執行階段事件。
開發時間診斷
.NET CLI 工具 (dotnet
SDK) 和 Visual Studio 為 build
和 publish
提供個別的命令。 build
(或 Visual Studio 中的 Start
) 使用 CoreCLR。 只有 publish
會建立原生 AOT 應用程式。 將您的應用程式發佈為原生 AOT 會產生已預先 (AOT) 編譯成機器碼的應用程式。 如先前所述,並非所有診斷工具都能順暢地與 .NET 8 中已發佈的原生 AOT 應用程式搭配運作。 然而所有 .NET 診斷工具都可在應用程式建置階段期間供開發人員使用。 建議您如往常一般地開發、偵錯及測試應用程式,並將使用原生 AOT 發佈工作應用程式作為最後步驟之一。
原生偵錯
當您在開發期間執行應用程式時 (例如在 Visual Studio 內或搭配 dotnet run
、dotnet build
或 dotnet test
),預設會在 CoreCLR 上執行。 不過如果 PublishAot
存在於專案檔中,則 CoreCLR 與原生 AOT 之間的行為應該相同。 這個特性可讓您使用標準 Visual Studio 受控偵錯引擎進行開發和測試。
發佈之後,原生 AOT 應用程式是真正的原生二進位檔。 受控偵錯工具將無法在其上運作。 然而原生 AOT 編譯器會產生完全原生的可執行檔,讓原生偵錯工具可以在您選擇的平台上進行偵錯 (例如,Windows 上的 WinDbg 或 Visual Studio,以及在類似 Unix 系統上的 gdb 或 lldb)。
原生 AOT 編譯器會產生行號、型別、區域和參數的相關資訊。 原生偵錯工具可讓您檢查堆疊追蹤和變數、進入或越過來源行,或設定行中斷點。
若要偵錯受控例外狀況,請在 RhThrowEx
方法上設定中斷點,亦即每當擲回受控例外狀況時就會呼叫這個中斷點。 例外狀況會儲存在 rcx
或 x0
暫存器中。 如果您的偵錯工具支援檢視 C++ 物件,可以將暫存器轉換為 S_P_CoreLib_System_Exception*
,以查看關於例外狀況的詳細資訊。
為原生 AOT 應用程式收集 dump 檔案牽涉到 .NET 8 中的一些手動步驟。
Visual Studio 特定的注意事項
您可以在 Visual Studio IDE 中開啟原生 AOT 編譯的可執行檔,以在 Visual Studio 偵錯工具下將其啟動。 您必須在 Visual Studio 中開啟可執行檔本身。
若要設定每當擲回例外狀況時即會中斷的中斷點,請從 [偵錯] > [Windows] 功能表中選擇 [中斷點] 選項。 在新視窗中,選取 [新增] > [函式] 中斷點。 指定 RhThrowEx
做為 [函式名稱],並將 [語言] 選項保留為 [所有語言] (不選取 C#)。
若要查看擲回的例外狀況,請啟動偵錯 ([偵錯] > [開始偵錯] 或 F5),開啟監看式視窗 ([偵錯] > [Windows] > [監看式]),並將下列運算式作為其中一個監看式:(S_P_CoreLib_System_Exception*)@rcx
。 這個機制利用的事實是在呼叫 RhThrowEx
時,x64 CPU 暫存器 RCX 會包含擲出的例外狀況。 您也可以將運算式貼上到 [立即] 視窗中;語法會與監看式相同。
符號檔案的重要性
發佈時,原生 AOT 編譯器會同時產生可執行檔和符號檔案。 原生偵錯以及如分析等相關活動,都需要存取原生符號檔案。 如果此檔案不存在,您可能已降級或有損毀結果。
如需此符號檔案的名稱和位置相關資訊,請參閱原生偵錯資訊。
CPU 分析
平台特定的工具 (如 PerfView 與 Perf) 可用來收集原生 AOT 應用程式的 CPU 範例。
堆積分析
原生 AOT 目前不支援受控堆積分析。 堆積分析工具 (如 dotnet-gcdump、PerfView 與 Visual Studio 堆積分析公具) 無法在 .NET 8 的原生 AOT 中運作。