Teilen über


Diagnose und Instrumentation

Die native AOT hat einige, aber nicht alle Diagnose- und Instrumentierungsfunktionen mit CoreCLR gemeinsam. Aufgrund der umfangreichen Auswahl an Diagnoseprogrammen von CoreCLR ist es manchmal hilfreich, Probleme in CoreCLR zu diagnostizieren und zu debuggen. Apps, die kürzungskompatibel sind, sollten keine Verhaltensunterschiede aufweisen, daher gelten die Untersuchungen oft für beide Laufzeiten. Dennoch können einige Informationen erst nach der Veröffentlichung gesammelt werden, sodass native AOT auch nach der Veröffentlichung Diagnosetools bereitstellen.

Unterstützung der nativen AOT-Diagnose in .NET 8

In der folgenden Tabelle sind Diagnosefeatures zusammengefasst, die für native AOT-Bereitstellungen unterstützt werden:

Feature Vollständig unterstützt Teilweise unterstützt Nicht unterstützt
Einblick und Telemetrie Teilweise unterstützt
Entwicklungszeitdiagnose Vollständig unterstützt
Systemeigenes Debuggen Teilweise unterstützt
CPU-Profilerstellung Teilweise unterstützt
Heapanalyse Nicht unterstützt

Einblick und Telemetrie

Ab .NET 8 unterstützt die native AOT-Laufzeit EventPipe, das von vielen Protokollierungs- und Ablaufverfolgungsbibliotheken als Basisebene verwendet wird. Sie können SChnittstellen mit EventPipe direkt über API, wie EventSource.WriteEvent, erstellen oder integrierte Bibliotheken wie z. B. OpenTelemetry verwenden. Die EventPipe-Unterstützung ermöglicht auch den meisten .NET-Diagnosetools wie dotnet-trace, dotnet-counters und dotnet-monitor die nahtlose Zusammenarbeit mit nativen AOT- oder CoreCLR-Anwendungen. EventPipe ist eine optionale Komponente in nativem AOT. Legen Sie für EventPipe-Unterstützung die MSBuild-Eigenschaft EventSourceSupport auf true fest.

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

Natives AOT unterstützt einige bekannte Ereignisanbieter teilweise. Nicht alle Laufzeitereignisse werden in nativem AOT unterstützt.

Entwicklungszeitdiagnose

Das .NET CLI-Tooling (dotnet SDK) und Visual Studio bieten separate Befehle für build und publish. build (oder Start in Visual Studio) verwendet CoreCLR. Nur publish erstellt eine native AOT-Anwendung. Wenn Sie Ihre App als native AOT-Bereitstellung veröffentlichen, entsteht eine App, die im Voraus (Ahead-Of-Time, AOT) in nativem Code kompiliert wurde. Wie bereits erwähnt, funktionieren nicht alle Diagnosetools nahtlos mit veröffentlichten nativen AOT-Anwendungen in .NET 8. Alle .NET-Diagnosetools sind jedoch während der Anwendungserstellung für Entwickelnde verfügbar. Es wird empfohlen, die Anwendungen wie gewohnt zu entwickeln, zu debuggen und zu testen und die funktionierende App mit nativem AOT in einem der letzten Schritte zu veröffentlichen.

Systemeigenes Debuggen

Wenn Sie Ihre App während der Entwicklung ausführen, z. B. in Visual Studio oder mit dotnet run, dotnet build, oder dotnet test wird sie standardmäßig auf CoreCLR ausgeführt. Wenn PublishAot jedoch in der Projektdatei vorhanden ist, sollte das Verhalten zwischen CoreCLR und Native AOT identisch sein. Mit dieser Eigenschaft können Sie die standardmäßige verwaltete Debug-Engine von Visual Studio für Entwicklung und Tests verwenden.

Nach der Veröffentlichung sind native AOT-Anwendungen echte systemeigene Binärdateien. Der verwaltete Debugger funktioniert dafür nicht. Der Native AOT-Compiler erzeugt jedoch vollständig native ausführbare Dateien, die von nativen Debuggern auf der Plattform Ihrer Wahl debuggt werden können (z. B. WinDbg oder Visual Studio auf Windows und gdb oder lldb auf Unix-ähnlichen Systemen).

Der native AOT-Compiler generiert Informationen zu Zeilennummern, Typen, lokalen Variablen und Parametern. Mit dem systemeigenen Debugger können Sie die Stapelablaufverfolgung und Variablen prüfen, zeilenweise oder über Quellzeilen wechseln oder Zeilenumbrüche festlegen.

Um verwaltete Ausnahmen zu debuggen, legen Sie einen Haltepunkt für die Methode RhThrowEx fest, der immer dann aufgerufen wird, wenn eine verwaltete Ausnahme ausgelöst wird. Die Ausnahme wird im Verzeichnis rcx oder x0 gespeichert. Wenn Ihr Debugger das Anzeigen von C++-Objekten unterstützt, können Sie das Register in S_P_CoreLib_System_Exception* umwandeln, um weitere Informationen zur Ausnahme anzuzeigen.

Das Sammeln einer Abbilddatei für eine native AOT-Anwendung umfasst einige manuelle Schritte in .NET 8.

Visual Studio-spezifische Hinweise

Sie können eine native AOT-kompilierte ausführbare Datei unter dem Visual Studio-Debugger starten, indem Sie diese in der Visual Studio-IDE öffnen. Sie müssen die ausführbare Datei selbst in Visual Studio öffnen.

Wenn Sie einen Haltepunkt festlegen möchten, der bei jedem Auslösen einer Ausnahme unterbrochen wird, wählen Sie im Menü Windows > debuggen die Option Haltepunkte aus. Wählen Sie im neuen Fenster die Neue >Haltepunkt-Funktion aus. Geben Sie RhThrowEx als Funktionsname an und lassen Sie die Option Sprache bei Alle Sprachen (nicht C# auswählen).

Um zu sehen, welche Ausnahme ausgelöst wurde, starten Sie das Debuggen (Debug >Debugging starten oder F5), öffnen Sie das Überwachungsfenster (Debug> Fenster > Überwachung), und fügen Sie den folgenden Ausdruck als eines der Überwachungselemente hinzu: (S_P_CoreLib_System_Exception*)@rcx. Dieser Mechanismus nutzt die Tatsache, dass dem Zeitpunkt RhThrowEx aufgerufen wird und dass das x64 CPU-Register RCX die ausgelöste Ausnahme enthält. Sie können den Ausdruck auch in das Direktfenster einfügen; der Syntax entspricht dem für die Überwachung.

Bedeutung der Symboldatei

Bei der Veröffentlichung erzeugt der native AOT-Compiler sowohl eine ausführbare Datei als auch eine Symboldatei. Systemeigenes Debuggen und zugehörige Aktivitäten wie Profilerstellung erfordern Zugriff auf die systemeigene Symboldatei. Wenn diese Datei nicht vorhanden ist, kann es sein, dass Sie schlechtere oder fehlerhafte Ergebnisse erhalten.

Informationen zum Namen und Speicherort der Symboldatei finden Sie unter Systemeigene Debuginformationen.

CPU-Profilerstellung

Zum Sammeln von CPU-Stichproben einer nativen AOT-Anwendung können plattformspezifische Tools wie PerfView und Perf verwendet werden.

Heapanalyse

Die verwaltete Heap-Analyse wird derzeit in Native AOT nicht unterstützt. Heapanalysetools wie dotnet-gcdump, PerfView- und die Heapanalysetools von Visual Studio funktionieren in nativem AOT in .NET 8 nicht.