診斷和檢測

原生 AOT 會與 CoreCLR 共用一些診斷和檢測功能,但並非全部。 由於 CoreCLR 具有豐富的診斷公用程式選取項目,因此有時在 CoreCLR 中診斷和偵錯問題會非常合適。 修剪相容的應用程式不應該有行為差異,因此調查通常適用於兩個執行階段。 儘管如此,某些資訊只能在發佈後收集,因此原生 AOT 也會提供發行後診斷工具。

.NET 8 原生 AOT 診斷支援

下表摘要說明原生 AOT 部署支援的診斷功能:

功能 完全支援 部分支援 不支援
可檢視性和遙測 部分支援
開發時間診斷 完全支援
原生偵錯 部分支援
CPU 分析 部分支援
堆積分析 不支援

可檢視性和遙測

原生 AOT 執行階段自 .NET 8 起會支援 EventPipe,這是許多記錄和追蹤程式庫使用的基底層。 您可以直接透過像 EventSource.WriteEvent 的 API 來與 EventPipe 進行連接,或者可以使用建置於頂層的程式庫,如 OpenTelemetry。 EventPipe 支援也可讓例如 dotnet-tracedotnet-countersdotnet-monitor 的 .NET 診斷工具搭配原生 AOT 或 CoreCLR 應用程式順暢地運作。 EventPipe 是原生 AOT 中的選用性元件。 若要包含 EventPipe 支援,請將 EventSourceSupport MSBuild 屬性設定為 true

<PropertyGroup>
    <EventSourceSupport>true</EventSourceSupport>
</PropertyGroup>

原生 AOT 為某些知名的事件提供者提供部分支援。 原生 AOT 不支援所有執行階段事件

開發時間診斷

.NET CLI 工具 (dotnet SDK) 和 Visual Studio 為 buildpublish 提供個別的命令。 build (或 Visual Studio 中的 Start) 使用 CoreCLR。 只有 publish 會建立原生 AOT 應用程式。 將您的應用程式發佈為原生 AOT 會產生已預先 (AOT) 編譯成機器碼的應用程式。 如先前所述,並非所有診斷工具都能順暢地與 .NET 8 中已發佈的原生 AOT 應用程式搭配運作。 然而所有 .NET 診斷工具都可在應用程式建置階段期間供開發人員使用。 建議您如往常一般地開發、偵錯及測試應用程式,並將使用原生 AOT 發佈工作應用程式作為最後步驟之一。

原生偵錯

當您在開發期間執行應用程式時 (例如在 Visual Studio 內或搭配 dotnet rundotnet builddotnet test),預設會在 CoreCLR 上執行。 不過如果 PublishAot 存在於專案檔中,則 CoreCLR 與原生 AOT 之間的行為應該相同。 這個特性可讓您使用標準 Visual Studio 受控偵錯引擎進行開發和測試。

發佈之後,原生 AOT 應用程式是真正的原生二進位檔。 受控偵錯工具將無法在其上運作。 然而原生 AOT 編譯器會產生完全原生的可執行檔,讓原生偵錯工具可以在您選擇的平台上進行偵錯 (例如,Windows 上的 WinDbg 或 Visual Studio,以及在類似 Unix 系統上的 gdb 或 lldb)。

原生 AOT 編譯器會產生行號、型別、區域和參數的相關資訊。 原生偵錯工具可讓您檢查堆疊追蹤和變數、進入或越過來源行,或設定行中斷點。

若要偵錯受控例外狀況,請在 RhThrowEx 方法上設定中斷點,亦即每當擲回受控例外狀況時就會呼叫這個中斷點。 例外狀況會儲存在 rcxx0 暫存器中。 如果您的偵錯工具支援檢視 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 分析

平台特定的工具 (如 PerfViewPerf) 可用來收集原生 AOT 應用程式的 CPU 範例。

堆積分析

原生 AOT 目前不支援受控堆積分析。 堆積分析工具 (如 dotnet-gcdumpPerfView 與 Visual Studio 堆積分析公具) 無法在 .NET 8 的原生 AOT 中運作。