Übung 4.3 Analysieren von Core-Abbilddateien auf einem anderen Computer – Verwenden von Docker zum Öffnen von Kernabbilddateien

Gilt für:   .NET Core 2.1, .NET Core 3.1, .NET 5

In diesem Artikel wird erläutert, wie Sie docker verwenden, um eine Kernabbilddatei auf einem Windows virtuellen Computer (VM) zu öffnen.

Voraussetzungen

Um diesen Abschnitt abzuschließen, sollten Sie mindestens eine Abbilddatei auf Ihren Windows virtuellen Computer in einem beliebigen Ordner kopiert haben.

Ziel dieser Übung

Sie erfahren, wie Sie mit Docker eine Kernabbilddatei auf einer anderen Linux-VM öffnen.

Informationen zu Containern und Docker

Gemäß der offiziellen Dokumentation von Docker ist ein Container eine Standardeinheit von Software, die Code und alle seine Abhängigkeiten verpackt, sodass die Anwendung schnell und zuverlässig von einer Computerumgebung in eine andere ausgeführt wird. Ein Docker-Containerimage ist ein einfaches, eigenständiges, ausführbares Softwarepaket, das alles enthält, was zum Ausführen einer Anwendung erforderlich ist: Code, Laufzeit, Systemtools, Systembibliotheken und Einstellungen.

Einfach ausgedrückt, können Sie Docker-Container verwenden, um Ihre Anwendungen auszuführen und bereitzustellen. Sie können Docker-Container aus verschiedenen Betriebssystemimages erstellen, z. B. Windows Core oder Ubuntu. In dieser Übung erstellen Sie einen Ubuntu-Container, um Ihre Kernabbilddatei zu analysieren.

Um Docker-Container auf einer Windows VM zu erstellen und zu verwenden, installieren Sie Docker Desktop für Windows. Im verknüpften Artikel werden die Anforderungen und Installationsschritte erläutert. Gemäß den Anforderungen verwendet Docker Windows Subsystem für Linux (WSL) für Linux-Container.

Hinweis

Docker kann sowohl Windows als auch Linux-Container ausführen, jedoch nicht gleichzeitig. Daher müssen Sie zu Linux-Containern wechseln.

Bevor Sie fortfahren, empfehlen wir Ihnen, sich in diesem häufig gestellten Artikel zu Docker mit Docker vertraut zu machen.

Erstellen einer Dockerfile-Datei

Nachdem Sie Docker Desktop auf Windows installiert haben, benötigen Sie eine Dockerfile-Datei. Eine Dockerfile-Datei ist einfach eine Reihe von Anweisungen zum Erstellen des Containers. Bei dem Dateinamen "dockerfile" wird die Groß-/Kleinschreibung beachtet, und es sollte sich um Kleinbuchstaben ohne Dateinamenerweiterung handeln.

Sie können Befehle im Zielcontainer mithilfe des BEFEHLS AUSFÜHREN ausführen. Die Dockerfile-Datei in diesem Abschnitt zeigt beispielsweise, dass Sie RUN mkdir /dumps einen Befehl auf dem mkdir /dumps Zielcontainerbetriebssystem ausführen können.

Dieses Beispiel zeigt Dockerfile-Inhalte, mit denen Sie das Ziel dieses Abschnitts erreichen können: Erstellen eines Ubuntu-Containers mithilfe des neuesten Ubuntu-Images, Installieren des neuesten Dotnet-SDKs, Aktualisieren des Betriebssystems, Installieren des Dotnet-Dump- und Dotnet-Symboltools, Kopieren und Extrahieren der Abbilddateien und Herunterladen der erforderlichen Dateien mithilfe des Dotnetsymboltools für eine der Kernabbilddateien.

Hinweis

Kommentare beginnen mit einem Nummernzeichen (#). Kommentare werden für jede Zeile bereitgestellt, damit Sie verstehen können, was jeder Befehl bewirkt.

# Install the latest Ubuntu container image
FROM ubuntu:latest
 
# Install the latest dotnet SDK
FROM mcr.microsoft.com/dotnet/core/sdk:latest AS tools-install
 
# Update the OS, the slash (\) means that the command continues on the next line
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y
 
# Install the dotnet-dump and dotnet-symbol tools in the /dotnetcore-tools folder
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-dump
RUN dotnet tool install --tool-path /dotnetcore-tools dotnet-symbol
 
# Add the /dotnetcore-tools in the PATH environment variable to run the dotnet-dump and dotnet-symbol tools directly
ENV PATH="/dotnetcore-tools:${PATH}"
 
# Create a /dumps folder in the Linux container
RUN mkdir /dumps
 
# Copy the coredumps.tar.gz file from a Windows VM to the /dumps folder on a Linux VM
COPY ./coredumps.tar.gz /dumps/
 
# Extract the tar file to the /dumps folder
RUN tar -xf /dumps/coredumps.tar.gz -C /dumps
 
# Run dotnet-symbol against one of the core dump files to download the required files (such as symbols and DAC)
RUN dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724 

Erstellen Sie eine Datei mit dem Namen "dockerfile" im selben Verzeichnis, das die Coredumps.tar.gz-Archivdatei enthält. Denken Sie daran: Beim Dateinamen wird die Groß-/Kleinschreibung beachtet und es gibt keine Erweiterung.

Erstellen und Ausführen des Docker-Containers

Auch hier müssen Sie zu Linux-Containern in Docker wechseln, wenn Windows Container ausgeführt werden.

Screenshot des Switch-Linux-Menüs.

Öffnen Sie dann ein Eingabeaufforderungsfenster, und wechseln Sie zu dem Ordner, der die Datei "coredumps.tar.gz" und "dockerfile" enthält. Führen Sie zum Erstellen des Docker-Containers docker build -t dotnettools . .

Hinweis

Der -t Parameter bedeutet "tag". Sie verwenden diesen Tagnamen, wenn Sie Ihren Docker-Container ausführen.

Der Punkt (.) am Ende des Befehls bedeutet, dass der Docker-Buildbefehl die Dockerfile-Datei aus dem aktuellen Verzeichnis verwendet.

Hier sehen Sie die Ausgabe des Buildbefehls. Da derselbe Befehl mehrmals ausgeführt wurde, verwendet er seinen internen Cache für das Zielimage. Wenn Sie diesen Befehl zum ersten Mal ausführen, werden die erforderlichen Dateien heruntergeladen und bei Bedarf zur späteren Verwendung zwischengespeichert. Es kann einige Zeit dauern, bis das Image erstellt wird, wenn Sie den Befehl zum ersten Mal ausführen.

Screenshot des Docker-Befehls.

Führen Sie dann den Container mithilfe des docker container run -it dotnettools /bin/bash Befehls aus.

Screenshot des Docker-Containerbefehls.

Das war's auch schon. Sie befinden sich jetzt im neu erstellten Linux-Container. Der Rest ist derselbe wie zuvor: Sie öffnen Das Kernabbild mit dem gleichen Dotnet-Dump-Befehl: dotnet-dump analyze /dumps/coredump.manual.1.11724 . Hier sehen Sie das Ergebnis der Beispielumgebung, die zum Erstellen der Schulungsserie verwendet wird.

Screenshot des Dotnet-Speicherabbildbefehls.

Sie können SOS-Befehle ausführen, z. clrthreads B. zum Anzeigen der verwalteten Threads.

Screenshot des Clrthreads-Befehls.

Jetzt können Sie kernabbilddateien in einem Linux-Container mithilfe von Docker analysieren.