Heapanalysetool (dotnet-gcdump)

Dieser Artikel gilt für: ✔️ dotnet-gcdump 3.1.57502 und höhere Versionen

Installieren

Es gibt zwei Möglichkeiten, dotnet-gcdump herunterzuladen und zu installieren:

  • Globales dotnet-Tool:

    Verwenden Sie zum Installieren der neuesten Releaseversion des NuGet-Paketsdotnet-gcdump den Befehl dotnet tool install:

    dotnet tool install --global dotnet-gcdump
    
  • Direkter Download:

    Laden Sie die ausführbare Datei für das Tool herunter, die Ihrer Plattform entspricht:

    OS Plattform
    Windows x86 | x64 | Arm | Arm64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Hinweis

Sie benötigen eine entsprechende x86-Version des Tools, um dotnet-gcdump für eine x86-App verwenden zu können.

Übersicht

dotnet-gcdump [-h|--help] [--version] <command>

Beschreibung

Das globale dotnet-gcdump-Tool sammelt Garbage Collector-Speicherabbilder (GC) von .NET-Liveprozessen mithilfe von EventPipe. GC-Speicherabbilder werden durch das Auslösen einer automatischen Speicherbereinigung im Zielprozess, das Aktivieren spezieller Ereignisse und das wiederholte Generieren des Graphs der Objektstämme aus dem Ereignisdatenstrom erstellt. Dieser Prozess ermöglicht das Erfassen von GC-Speicherabbildern während der Prozessausführung mit minimalem Aufwand. Diese Speicherabbilder sind für verschiedene Szenarios nützlich:

  • Vergleichen der Anzahl von Objekten auf dem Heap zu verschiedenen Zeitpunkten
  • Analysieren des Stamms von Objekten (Beantwortung von Fragen wie „Was verweist noch auf diesen Typ?“)
  • Erfassen allgemeiner Statistiken über die Anzahl von Objekten auf dem Heap

Anzeigen des von dotnet-gcdump erfassten GC-Speicherabbilds

Unter Windows können .gcdump-Dateien zur Analyse in PerfView oder in Visual Studio angezeigt werden. Derzeit gibt es keine Möglichkeit, eine .gcdump-Datei auf anderen Plattformen als Windows zu öffnen.

Sie können mehrere .gcdump-Dateien erfassen und gleichzeitig in Visual Studio öffnen, um sie zu vergleichen.

Tastatur

  • --version

    Hiermit wird die Version des dotnet-gcdump-Hilfsprogramms angezeigt.

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

Befehle

Befehl
dotnet-gcdump collect
dotnet-gcdump ps
dotnet-gcdump report

dotnet-gcdump collect

Hiermit wird ein GC-Speicherabbild aus einem derzeit laufenden Prozess erfasst.

Warnung

Dieser Befehl löst eine (vollständige) Garbage Collection (GC) der Generation 2 aus, um den GC-Heap zu durchlaufen. Dadurch kann die Runtime für längere Zeit unterbrochen werden – insbesondere dann, wenn der GC-Heap groß ist. Verwenden Sie diesen Befehl nicht in leistungsabhängigen Umgebungen, wenn der GC-Heap groß ist.

Übersicht

dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]

Optionen

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

  • -p|--process-id <pid>

    Dies ist die ID des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.

  • -o|--output <gcdump-file-path>

    Dies ist der Pfad, in den erfasste GC-Speicherabbilder geschrieben werden sollen. Wird standardmäßig auf .\YYYYMMDD_HHMMSS_<pid>.gcdump festgelegt.

  • -v|--verbose

    Hiermit wird das Protokoll während der Erfassung des GC-Speicherabbilds ausgegeben.

  • -t|--timeout <timeout>

    Hiermit wird die Erfassung des GC-Speicherabbilds angehalten, wenn diese länger als eine bestimmte Anzahl von Sekunden dauert. Der Standardwert ist 30.

  • -n|--name <name>

    Dies ist der Name des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.

Hinweis

Unter Linux und macOS erwartet dieser Befehl, dass die Zielanwendung und dotnet-gcdump die gleiche TMPDIR-Umgebungsvariable verwenden. Andernfalls führt der Befehl zu einem Timeout.

Hinweis

Wenn Sie mit dotnet-gcdump ein Garbage Collection-Speicherabbild erfassen möchten, muss der Befehl vom Rootbenutzer oder dem Benutzer ausgeführt werden, der den Zielprozess ausführt. Andernfalls kann das Tool keine Verbindung mit dem Zielprozess herstellen.

dotnet-gcdump ps

Hiermit werden die dotnet-Prozesse aufgelistet, für die GC-Speicherabbilder erfasst werden können. Ab dotnet-gcdump 6.0.320703 werden auch die Befehlszeilenargumente angezeigt, mit denen jeder Prozess gestartet wurde, sofern verfügbar.

Übersicht

dotnet-gcdump ps [-h|--help]

Beispiel

Angenommen, Sie starten eine zeitintensive App mit dem Befehl dotnet run --configuration Release. In einem anderen Fenster führen Sie den Befehl dotnet-gcdump ps aus. Die Ausgabe sieht wie folgt aus. Sofern vorhanden, werden die Befehlszeilenargumente ab der dotnet-gcdump-Version 6.0.320703 angezeigt.

> dotnet-gcdump ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe     run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

dotnet-gcdump report <gcdump_filename>

Hiermit wird ein Bericht aus einem zuvor generierten GC-Speicherabbild oder aus einem laufenden Prozess generiert und in stdout geschrieben.

Übersicht

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

Optionen

  • -h|--help

    Zeigt die Hilfe für die Befehlszeile an.

  • -p|--process-id <pid>

    Dies ist die ID des Prozesses, von dem das GC-Speicherabbild erfasst werden soll.

  • -t|--report-type <HeapStat>

    Dies ist der Typ des zu generierenden Berichts. Verfügbare Optionen: HeapStat (Standard)

Problembehandlung

  • In der gcdump-Datei sind keine Typinformationen enthalten.

    Vor .NET Core 3.1 gab es ein Problem, bei dem ein Typcache zwischen gcdump-Dateien nicht gelöscht wurde, wenn diese mit EventPipe aufgerufen wurden. Dies führte dazu, dass die Ereignisse, die zum Bestimmen der Typinformationen benötigt werden, für die zweite und nachfolgende gcdump-Dateien nicht gesendet wurden. Dieses Problem wurde in .NET Core 3.1-preview2 behoben.

  • COM- und statische Typen sind nicht im GC-Speicherabbild enthalten.

    Vor .NET Core 3.1 gab es ein Problem, bei dem statische und COM-Typen nicht gesendet wurden, wenn das GC-Speicherabbild über EventPipe aufgerufen wurde. Dies wurde in .NET Core 3.1 behoben.

  • dotnet-gcdump kann aufgrund fehlender Informationen keine .gcdump-Datei erstellen, z. B. [Fehler] Ausnahme während gcdump: System.ApplicationException: ETL-Datei zeigt den Beginn eines Heapspeicherabbilds, aber nicht die Beendigung.. Oder die .gcdump-Datei enthält nicht den gesamten Heap.

    dotnet-gcdump erfasst eine Ablaufverfolgung von Ereignissen, die vom Garbage Collector während einer induzierten Generation 2-Auflistung ausgegeben werden. Wenn der Heap ausreichend groß ist oder nicht genügend Arbeitsspeicher zum Skalieren der Ereignispuffer vorhanden ist, werden möglicherweise die Ereignisse gelöscht, die zum Rekonstruieren des Heapdiagramms aus der Ablaufverfolgung erforderlich sind. In diesem Fall wird empfohlen, ein Speicherabbild des Prozesses zu erfassen, um Probleme mit dem Heap zu diagnostizieren.

  • dotnet-gcdump scheint das Problem „Nicht genügend Arbeitsspeicher“ in einer Speicherumgebung mit eingeschränktem Arbeitsspeicher zu verursachen.

    dotnet-gcdump erfasst eine Ablaufverfolgung von Ereignissen, die vom Garbage Collector während einer induzierten Generation 2-Auflistung ausgegeben werden. Der Puffer für die Ereignissammlung befindet sich im Besitz der Zielanwendung und kann bis zu 256 MB groß werden. dotnet-gcdump selbst verwendet auch Arbeitsspeicher. Wenn die Arbeitsspeichermenge in Ihrer Umgebung beschränkt ist, berücksichtigen Sie diese Faktoren beim Erfassen eines gcdump, um Fehler zu vermeiden.