Sie können unter die Haube des Codes schauen oder mit vielen Tools auf das interne CLR-Gerät schauen. Dieser Beitrag entstand aus einem Tweet und ich muss mich bei allen bedanken, die mitgeholfen haben, eine Liste geeigneter Tools zu erstellen. Wenn ich einen von ihnen verpasst habe, schreibe in die Kommentare.
Zunächst muss ich erwähnen, dass in Visual Studio und VSCode bereits ein guter Debugger vorhanden ist . Es gibt auch viele gute (kommerzielle) .NET-Profiler und Tools zur Anwendungsüberwachung, die einen Blick wert sind. Zum Beispiel habe ich kürzlich versucht, mit Codetrack zu arbeiten, und war von seinen Fähigkeiten beeindruckt.
Der verbleibende Beitrag ist jedoch Tools zur Ausführung einzelner Aufgaben gewidmet , die helfen, besser zu verstehen, was passiert. Alle Tools sind Open Source .

PerfView ist ein großartiges Tool, das ich seit mehreren Jahren verwende. Es basiert auf Windows Event Tracing (ETW) und ermöglicht es Ihnen, besser zu verstehen, was in der CLR geschieht, und bietet auch die Möglichkeit, ein Profil der Speicher- und CPU-Auslastung zu erhalten. Um das Tool zu beherrschen, müssen Sie viele Informationen aufnehmen, beispielsweise mithilfe von Schulungsvideos. Die Zeit und Mühe lohnt sich jedoch.
Das Tool ist so nützlich, dass Microsoft-Ingenieure es selbst verwenden. Viele der jüngsten Leistungsverbesserungen in MSBuild wurden nach der Analyse von Engpässen mit PerfView angezeigt.
Das Tool basiert auf der Microsoft.Diagnostics.Tracing.TraceEvent-Bibliothek , mit der Sie Ihre eigenen Tools erstellen können. Da der Quellcode der Bibliothek dank der Community geöffnet ist, sind darüber hinaus viele nützliche Funktionen enthalten, z. B. Flammengraphen :

SharpLab wurde als Tool zur Überprüfung des vom Roslyn-Compiler generierten IL-Codes entwickelt und schließlich zu etwas anderem :
SharpLab ist eine interaktive Umgebung zum Ausführen von .NET-Code, in der die Zwischenschritte und Ergebnisse des Kompilierens des Codes angezeigt werden. Einige Funktionen der Sprache sind nur Wrapper für andere, z. B. wird using () zu try / catch. Mit SharpLab sehen Sie den Code so, wie der Compiler ihn sieht, und verstehen die Essenz von .NET-Sprachen besser.
Das Tool unterstützt C #, Visual Basic und F #, aber die interessantesten Funktionen sind Dekompilierung / Disassemblierung:
Die Dekompilierungs- / Demontagefunktionen können verwendet werden, um:
- C #
- Visual Basic
- IL
- JIT Asm (nativer Asm-Code)
Sie haben richtig verstanden: Das Tool gibt den Assembler-Code aus , den .NET JIT aus Ihrem C # -Code generiert:

Mit diesem Tool können Sie die Struktur von .NET-Objekten im Speicher analysieren, d. H. wie JITter die Felder Ihrer Klasse oder Struktur angeordnet hat. Dies ist nützlich, wenn Sie Hochleistungscode schreiben. Es ist auch schön, ein Werkzeug zu haben, das die harte Arbeit für uns erledigt.
Es gibt keine offizielle Dokumentation, die die Feldstruktur beschreibt, da sich CLR-Autoren das Recht vorbehalten, sie in Zukunft zu ändern. Die Kenntnis der Struktur kann jedoch hilfreich sein, wenn Sie an einer Hochgeschwindigkeitsanwendung arbeiten.
Wie können Sie die Struktur studieren? Sie können den !dumpobj
in Visual Studio !dumpobj
oder den !dumpobj
in der SOS-Debugging-Erweiterung verwenden . Beide Ansätze erfordern viel Aufwand, daher erstellen wir ein Tool, das die Struktur des Objekts zur Laufzeit anzeigt.
Wenn Sie gemäß dem Beispiel im GitHub-Repository TypeLayout.Print<NotAlignedStruct>()
mit ähnlichem Code verwenden:
public struct NotAlignedStruct { public byte m_byte1; public int m_int; public byte m_byte2; public short m_short; }
Die folgende Ausgabe wird angezeigt, die genau zeigt, wie die CLR die Struktur basierend auf Optimierungs- und Füllregeln im Speicher anordnet.
Size: 12. Paddings: 4 (%33 of empty space) |================================| | 0: Byte m_byte1 (1 byte) | |--------------------------------| | 1-3: padding (3 bytes) | |--------------------------------| | 4-7: Int32 m_int (4 bytes) | |--------------------------------| | 8: Byte m_byte2 (1 byte) | |--------------------------------| | 9: padding (1 byte) | |--------------------------------| | 10-11: Int16 m_short (2 bytes) | |================================|
Wie auf der GitHub-Seite angegeben , ist TUNE ein vielversprechendes Tool. Hier erfahren Sie mehr über .NET-Interna und wie Sie die Leistung durch Experimentieren mit C # -Code verbessern können.
Detaillierte Informationen über ihn finden Sie in diesem Beitrag , aber auf hoher Ebene funktioniert er wie folgt :
- Schreiben Sie ein funktionierendes C # -Codebeispiel, das mindestens eine Klasse mit einer öffentlichen Methode enthält, die einen Zeichenfolgenparameter verwendet. Der Code wird über die Schaltfläche Ausführen gestartet. Sie können beliebig viele Methoden und Klassen einschließen. Denken Sie jedoch daran, dass die erste öffentliche Methode aus der ersten öffentlichen Klasse mit dem ersten Parameter aus dem Eingabefenster unter dem Code ausgeführt wird.
- Klicken Sie auf die Schaltfläche Ausführen, um den Code zu kompilieren und auszuführen. Außerdem wird es auf den entsprechenden Registerkarten in IL-Code und Assembler-Code kompiliert.
- Während Tune ausgeführt wird (auch zur Laufzeit), erstellt das Tool ein Diagramm, in dem Garbage Collector-Daten angezeigt werden. Es enthält Informationen zu Generationsgrößen und Garbage Collection-Sitzungen (dargestellt als vertikale Linien mit einer Zahl darunter, die angibt, in welcher Generation Garbage Collection durchgeführt wird).
Es sieht so aus:

CLR-Speicherdiagnose-Tools (ClrMD)
Schauen wir uns zum Schluss eine bestimmte Kategorie von Werkzeugen an. Seit der Veröffentlichung von .NET konnten Entwickler WinDBG und die SOS-Debugging-Erweiterung immer verwenden, um zu sehen, was in der .NET-Laufzeit passiert. Dies sind jedoch nicht die einfachsten Werkzeuge für eine erste Bekanntschaft und, wie im nächsten Tweet angegeben, nicht immer die produktivsten:
Glücklicherweise hat Microsoft die ClrMD- Bibliothek (auch als Microsoft.Diagnostics.Runtime bekannt ) zur Verfügung gestellt, und jetzt kann jeder ein Tool zum Analysieren von Speicherabbildern für .NET-Programme erstellen. Detaillierte Informationen finden Sie im offiziellen Blog . Ich empfehle auch einen Blick auf ClrMD.Extensions , das "... die Integration mit LINPad ermöglicht und die Verwendung von ClrMD noch einfacher macht".
Ich wollte eine Liste aller vorhandenen Tools zusammenstellen und bat Twitter um Hilfe. Erinnern Sie sich: Seien Sie vorsichtig mit Tweets. Der für WinDBG verantwortliche Manager kann sie lesen und verärgert sein!
Die meisten dieser Tools arbeiten auf der Basis von ClrMD, da dies am einfachsten ist. Wenn Sie möchten, können Sie die COM-Schnittstellen direkt verwenden . Es sollte auch beachtet werden, dass jedes ClrMD-basierte Tool nicht plattformübergreifend ist , da ClrMD selbst nur für Windows entwickelt wurde. Plattformübergreifende Optionen werden unter Analysieren eines .NET Core Core Dump unter Linux beschrieben .
Um das Gleichgewicht zu halten, erschien kürzlich eine verbesserte Version von WinDBG , die sofort versucht wurde, Funktionen hinzuzufügen:
Gehen Sie nach all diesen Wörtern zur Liste:
- SuperDump ( GitHub )
- Tool zur automatischen Analyse von Crash Dump ( Präsentation )
- msos ( github )
- Eine Umgebung mit einer Befehlszeilenschnittstelle wie WinDbg zum Ausführen von SOS-Befehlen ohne SOS.
- MemoScope.Net ( GitHub )
- Ein Tool zum Analysieren des Prozessspeichers in .NET. Sie können den Anwendungsspeicher in eine Datei kopieren und später lesen.
- Die Datei enthält alle Daten (Objekte) und Informationen zu den Threads (Status, Stapel, Aufrufstapel). MemoScope.Net analysiert die Daten und hilft Ihnen, Speicherlecks und Deadlocks zu finden.
- dnSpy ( Github )
- .NET Assembly Debugger und Editor
- Es kann zum Bearbeiten und Debuggen von Assemblys verwendet werden, auch wenn Sie keinen Quellcode haben.
- MemAnalyzer ( GitHub )
- Ein Speicheranalyse-Tool für verwalteten Code. Es gibt eine Befehlszeilenschnittstelle.
- Wie
!DumpHeap
in Windbg kann bestimmen, welche Objekte den meisten Speicherplatz auf dem Heap beanspruchen, ohne einen Debugger installieren zu müssen.
- DumpMiner ( GitHub )
- Trace CLI ( GitHub )
- Tool zum Debuggen und Verfolgen während des Betriebs
- Schuppen ( GitHub )
- Shed ist eine Anwendung, die die Ausführung eines Programms in .NET analysiert. Es kann verwendet werden, um Malware zu analysieren, um Daten darüber zu erhalten, welche Informationen beim Start einer solchen Software gespeichert werden. Schuppen kann:
- Rufen Sie alle im verwalteten Heap gespeicherten Objekte ab
- im Speicher gespeicherte Anzeigezeilen;
- Erstellen Sie einen Heap-Snapshot im JSON-Format zur weiteren Verarbeitung.
- Dump alle Module in den Speicher geladen.
Sie können viele andere Tools finden , die ClrMD verwenden . Die Bereitstellung war eine gute Idee von Microsoft.
Andere Werkzeuge
Weitere erwähnenswerte Tools:
- Debugdiag
- Das DebugDiag-Tool wurde entwickelt, um Probleme wie Einfrieren, schlechte Leistung, Speicherlecks oder Fragmentierung sowie Fehler in Prozessen im Benutzermodus (jetzt mit CLRMD-Integration) zu beheben.
- SOSEX (wird möglicherweise nicht mehr entwickelt)
- ... eine Erweiterung zum Debuggen von verwaltetem Code, die meine Unzufriedenheit mit SOS verringert.
- VMMap von Sysinternals
- VMMap ist ein Tool zur Analyse des virtuellen und physischen Speichers von Prozessen.
- Ich habe es verwendet, um die Speichernutzung in der CLR zu analysieren
