Ü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.
Ö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.
Führen Sie dann den Container mithilfe des docker container run -it dotnettools /bin/bash Befehls aus.
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.
Sie können SOS-Befehle ausführen, z. clrthreads B. zum Anzeigen der verwalteten Threads.
Jetzt können Sie kernabbilddateien in einem Linux-Container mithilfe von Docker analysieren.