Übung 4.2 Analysieren der Kernabbilddateien auf einem anderen Computer – Verwenden von WSL 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 Windows-Subsystem für Linux (WSL) Version 2 verwenden, um eine Kernabbilddatei auf einem anderen virtuellen Computer (VM) zu öffnen.
Voraussetzungen
Um diesen Abschnitt nachvollziehen und abschließen zu können, sollten Sie über Folgendes verfügen:
- Ein Windows 10-basierter Computer, um Windows-Subsystem für Linuxzu aktivieren.
- Mindestens eine zentrale Speicherabbilddatei, die auf Ihren Windows-basierten Computer in einem beliebigen Ordner kopiert wird.
Ziel dieser Übung
Sie erfahren, wie Sie mithilfe von WSL Version 2 eine Kernabbilddatei auf einem anderen virtuellen Computer öffnen.
Verwenden von Windows-Subsystem für Linux
Mit WSL können Entwickler eine LINUX/Linux-Umgebung direkt auf Windows ausführen, ohne dass ein herkömmlicher virtueller Computer oder duales Startsetup erforderlich ist.
Um WSL zu aktivieren, wechseln Sie zu Windows Serverinstallationshandbuch,und aktualisieren Sie dann auf WSL2. In dieser Übung wird davon ausgegangen, dass Sie den gleichen Ubuntu 18.04 LTS wie zuvor als Linux-Betriebssystem ausgewählt haben. Das System wird mithilfe von WSL2 ausgeführt.
Aktualisieren Sie nach der Installation von WSL2 den Paket-Manager mit den Befehlen und den sudo apt update sudo apt upgrade Befehlen. Sie sollten mit diesen Befehlen aus den vorherigen Abschnitten dieser Reihe vertraut sein, wenn Sie die Linux-VM zum ersten Mal installiert haben.
sudo apt update
sudo apt upgrade
Kopieren von Dateien aus Windows auf Linux
WSL2 sollte nun auf Ihrem Windows-basierten Computer ausgeführt werden. Im vorherigen Abschnitt haben Sie die Kernabbilddateien aus dem Ordner "D:\Learn\Linux\Dumps" auf Ihrem Windows-basierten Computer kopiert, und der Dateiname wurde als "coredumps.tar.gz" angenommen. Ihr Ziel ist es nun, D:\Learn\Linux\Dumps\coredumps.tar.gz auf die Linux-VM zu kopieren, die in WSL2 ausgeführt wird.
Sehen Sie sich den folgenden Screenshot der Befehlszeile in WSL2 an, und beachten Sie, dass das Laufwerk C in Windows auf dem WSL2 Linux-Computer als /mnt/c zugeordnet ist. Um den Inhalt des Ordners D:\Learn\Linux\Dumps aufzuführen, können Sie daher ll mnt/d/Learn/Linux/Dumps/ ausführen.
Kopieren und extrahieren Sie nun die Datei "coredumps.tar.gz" in einen Speicherabbilddateienordner im Linux-Startverzeichnis. Die Schritte sind einfach:
- Ändern Sie das Verzeichnis mithilfe des Befehls in Ihr
cd ~Startverzeichnis. - Erstellen Sie einen Speicherabbilddateienordner, indem Sie
mkdir dumpsausführen. - Extrahieren Sie die Datei "coredumps.tar.gz", indem Sie
tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/ausführen.
Der folgende Screenshot zeigt diese Befehle in Aktion.
Öffnen der Kernabbilddatei mithilfe von Dotnet-Dump
Der Rest des Verfahrens ähnelt den vorherigen Problembehandlungslaboren, in denen Sie .NET Core und .NET SDK installiert haben. In diesem Abschnitt werden sie erneut durch diese Schritte geführt.
Das Dotnet-Dump-Tool erfordert .NET SDK. Daher müssen Sie vor der Installation des Dotnet-Dumps das .NET SDK installieren. Wie bereits erwähnt, müssen Sie vor der Installation des .NET SDK den Microsoft-Paketsignaturschlüssel zur Liste der vertrauenswürdigen Schlüssel hinzufügen und dann das Paket-Repository hinzufügen, wie unter "Installieren des SDK"erläutert. Sehen Sie sich die Schritte in Aktion im folgenden Screenshot an.
Jetzt können Sie das neueste SDK erneut installieren, wie unter "Installieren des SDKs"erläutert. Der folgende Screenshot zeigt die Windows-Terminal, die das Ergebnis der Befehle anzeigt.
Sie öffnen die Kernabbilddatei mithilfe des Dotnet-Dumps. Daher müssen Sie das Tool zuerst installieren. Wie bereits erwähnt, lautet der Befehl zum Installieren des Dotnet-Dumps als globales Tool dotnet tool install -g dotnet-dump .
Nach der Installation können Sie mit der Untersuchung der wichtigsten Abbilddateien beginnen. Öffnen Sie die Kernabbilddatei mithilfe des Dotnet-Dumps. Führen Sie wie im vorherigen Labor den folgenden Befehl aus:
dotnet-dump analyze ~/dumps/coredump.manual.1.11724
Versuchen Sie die Ausführung clrthreads auszuführen, um die verwalteten Threads anzuzeigen. Dieser Befehl schlägt erwartungsgemäß fehl und generiert die folgende Fehlermeldung.
Die Fehlermeldung lautet wie folgt:
mscordaccore.dll kann nicht geladen oder initialisiert werden. Die Ziellaufzeit wird möglicherweise nicht initialisiert.
Dieser Fehler tritt auf, weil die erforderliche .NET Core-Laufzeit nicht auf der Linux-VM installiert ist. Wie in Debug-Linux-Abbildernerläutert, benötigen sowohl LLDB als auch SOS zum Analysieren von .NET Core-Abbildern die folgenden .NET Core-Binärdateien aus der Umgebung, in der die Speicherabbilddatei erstellt wurde:
- libmscordaccore.so
- libcoreclr.so
- Dotnet (der Host, der zum Starten der App verwendet wurde)
Dies war in den früheren Problembehandlungslaboren kein Problem, da Sie die Abbilddateien auf demselben virtuellen Computer analysiert haben, auf dem die Anwendung gehostet und ausgeführt wurde. Daher waren die Dateien bereits vorhanden. Jetzt müssen Sie entweder die richtige Version dieser Dateien von einer anderen Stelle kopieren (z. B. von der VM, auf der die Kernabbilddateien gespeichert wurden), oder Sie müssen dieselbe .NET-Laufzeit auf der WSL2-Linux-VM installieren.
Es gibt mehrere Methoden, um die .NET Core-Ziellaufzeit zu bestimmen. Am einfachsten fragen Sie den Anwendungsbesitzer. Wenn Sie der Besitzer sind, kennen Sie auch die .NET Core-Ziellaufzeit der Anwendung. Was geschieht, wenn Sie überhaupt nicht über diese Informationen verfügen? In diesem Fall können Sie einen SOS-Erweiterungsbefehl lm verwenden oder , der die modules systemeigenen Module auflistet, die im Prozess geladen werden. Führen Sie diesen Befehl aus, um die Version Ihrer .NET-Installation zu ermitteln.
Wie in diesem Screenshot gezeigt, war die .NET Core-Laufzeitversion 3.1.10. Sie benötigen die richtige Version von libmscordaccore.so, libcoreclr.so und .NET. Sie können diese Dateien von der VM kopieren, auf der die Kernabbilddateien generiert wurden.
Gibt es eine andere Möglichkeit, dasselbe Ergebnis zu erzielen? Können Sie beispielsweise .NET Core Runtime Version 3.1.10 installieren, um diese Dateien zu erhalten? Die kurze Antwort lautet "Ja", das können Sie. Sie können sie jedoch nicht mithilfe des sudo apt install dotnet-runtime-3.1.10 Befehls installieren.
Stattdessen können Sie .NET Core Runtime 3.1 installieren. Diese Version installiert jedoch die neueste .NET Core 3.1-Version (.NET Core 3.1.15 zum Zeitpunkt der Entwicklung dieses Artikels).
Dies funktioniert nicht, da die Kernabbilddatei für einen .NET Core 3.1.10-Prozess verwendet wird. Sie benötigen die übereinstimmende Version dieser erforderlichen Dateien.
Glücklicherweise gibt es ein Dotnetsymboltool, das die Dateien (Symbole, DAC, Module usw.) herunterladen kann, die für das Debuggen von Kernabbilddateien erforderlich sind. Möglicherweise erinnern Sie sich an dieses Tool aus unseren vorherigen Abschnitten. Führen Sie den Befehl aus, um dieses Tool zu dotnet tool install -g dotnet-symbol installieren.
Jetzt müssen Sie das Dotnet-Symboltool bitten, die erforderlichen Dateien herunterzuladen, die auf unsere Kernabbilddatei abzielen. Dadurch werden der Name der Kernabbilddatei und andere erforderliche Parameter übergeben: dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724 .
Sie können die letzten beiden Fehler in der Liste ignorieren. Die erforderlichen Dateien werden in den Ordner "~/dumps" heruntergeladen.
Öffnen Sie die Kernabbilddatei mithilfe des Dotnet-Dumps, und versuchen Sie, dieselben clrthreads Befehle auszuführen.
Sie sollten jetzt in der Lage sein, die zentrale Abbilddatei auf Ihrem Windows virtuellen Computer mithilfe von WSL2 zu öffnen.
Öffnen von Abbilddateien in lldb
Diese Schritte sind identisch mit den vorherigen Problembehandlungslaboren. Sie sollten bereits die wichtigen Teile behandelt haben, um die erforderlichen Dateien zum Debuggen von Kernabbilddateien mithilfe von Dotnet-Dump abzurufen. Die Prozedur ist für LLDB identisch. Wenn Sie lldb für das Debuggen installieren und verwenden möchten, überprüfen Sie die vorherigen Labore.
Wenn das Dotnetsymbol die erforderlichen Dateien nicht finden kann
Das Dotnet-Symbol funktioniert für die meisten wichtigen Abbilddateien. Wenn aus irgendeinem Grund die erforderlichen Dateien nicht heruntergeladen werden können, gibt es Möglichkeiten, die Blockierung zu umgehen. Sie können die Binärdateien von der offiziellen Microsoft-Webseite herunterladen und extrahieren. Kopieren Sie dann die erforderlichen Dateien manuell in denselben Ordner, der die Kernabbilddatei enthält.
Wenn Sie beispielsweise die Dateien für .NET Core 3.1.10 x64 benötigen, können Sie die Binärdateien aus dieser ASP.NET Core 3.1 Runtime (v3.1.10) – Linux x64-Binärdateien herunterladen unddie Dateien manuell kopieren:
- .\shared\Microsoft.NETCore.App\3.1.10\libcoreclr.so
- .\shared\Microsoft.NETCore.App\3.1.10\libmscordaccore.so
- .\shared\Microsoft.NETCore.App\3.1.10\libmscordbi.so
- .\shared\Microsoft.NETCore.App\3.1.10\
- .\dotnet
Wenn es sich bei der Ziellaufzeitversion um eine private Version handelt (denken Sie daran, dass .NET Core Open Source ist und Sie Eine eigene private Version erstellen und verwenden können), müssen Sie diese Dateien von der Linux-VM kopieren, auf der die Kernabbilddatei generiert wurde.