Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: .NET Core 2.1, .NET Core 3.1, .NET 5
W tym artykule omówiono sposób używania programu Podsystem Windows dla systemu Linux (WSL) w wersji 2 w celu otwarcia podstawowego pliku zrzutu na innej maszynie wirtualnej.
Wymagania wstępne
Aby móc postępować zgodnie z instrukcjami i ukończyć tę sekcję, musisz mieć następujące elementy:
- Komputer z systemem Windows 10 umożliwiający Podsystem Windows dla systemu Linux.
- Co najmniej jeden podstawowy plik zrzutu skopiowany na komputer z systemem Windows w dowolnym folderze.
Cel tego laboratorium
Dowiesz się, jak otworzyć plik zrzutu podstawowego na innej maszynie wirtualnej przy użyciu programu WSL w wersji 2.
Korzystanie z Podsystem Windows dla systemu Linux
Program WSL umożliwia deweloperom uruchamianie środowiska GNU/Linux bezpośrednio w systemie Windows bez konieczności instalowania tradycyjnej maszyny wirtualnej lub konfiguracji podwójnego rozruchu.
Aby włączyć program WSL, przejdź do przewodnika instalacji systemu Windows Server, a następnie uaktualnij do programu WSL2. W tym laboratorium przyjęto założenie, że wybrano ten sam system Ubuntu 18.04 LTS co poprzednio jako system operacyjny Linux. System zostanie uruchomiony przy użyciu protokołu WSL2.
Po zainstalowaniu programu WSL2 zaktualizuj menedżera pakietów przy użyciu sudo apt update
poleceń i sudo apt upgrade
. Podczas instalowania maszyny wirtualnej z systemem Linux po raz pierwszy należy zapoznać się z tymi poleceniami z wcześniejszych sekcji tej serii.
sudo apt update
sudo apt upgrade
Kopiowanie plików z systemu Windows do systemu Linux
Teraz na komputerze z systemem Windows powinien działać system WSL2. W poprzedniej sekcji skopiowano pliki zrzutu podstawowego z folderu D:\Learn\Linux\Dumps na komputerze z systemem Windows, a nazwa pliku została założona jako coredumps.tar.gz. Twoim celem jest teraz skopiowanie D:\Learn\Linux\Dumps\coredumps.tar.gz do maszyny wirtualnej z systemem Linux uruchomionej w systemie WSL2.
Patrząc na poniższy zrzut ekranu wiersza polecenia w WSL2, zwróć uwagę, że dysk C w systemie Windows jest mapowany jako /mnt/c na maszynie z systemem Linux WSL2. W związku z tym, aby wyświetlić listę zawartości folderu D:\Learn\Linux\Dumps , można uruchomić polecenie ll mnt/d/Learn/Linux/Dumps/
.
Teraz skopiuj i wyodrębnij plik coredumps.tar.gz do folderu plików zrzutu w katalogu głównym systemu Linux. Kroki są łatwe:
- Zmień katalog na katalog macierzysny
cd ~
przy użyciu polecenia . - Utwórz folder plików zrzutu, uruchamiając polecenie
mkdir dumps
. - Wyodrębnij plik coredumps.tar.gz , uruchamiając polecenie
tar -xf /mnt/d/Learn/Linux/Dumps/coredumps.tar.gz -C dumps/
.
Poniższy zrzut ekranu przedstawia te polecenia w akcji.
Otwórz plik zrzutu podstawowego przy użyciu polecenia dotnet-dump
Pozostała część procedury jest podobna do wcześniejszych laboratoriów rozwiązywania problemów, w których zainstalowano zestaw .NET Core i zestaw .NET SDK. Ta sekcja przeprowadzi Cię ponownie przez te kroki.
Narzędzie dotnet-dump wymaga zestawu .NET SDK. W związku z tym przed zainstalowaniem narzędzia dotnet-dump należy zainstalować zestaw SDK platformy .NET. Jak wspomniano wcześniej, przed zainstalowaniem zestawu SDK platformy .NET należy dodać klucz podpisywania pakietów firmy Microsoft do listy zaufanych kluczy, a następnie dodać repozytorium pakietów zgodnie z opisem w temacie Instalowanie zestawu SDK. Zapoznaj się z krokami w akcji na poniższym zrzucie ekranu.
Teraz możesz ponownie zainstalować najnowszy zestaw SDK, jak wyjaśniono w temacie Instalowanie zestawu SDK. Poniższy zrzut ekranu przedstawia Terminal Windows wyświetlający wynik poleceń.
Plik zrzutu podstawowego zostanie otwarty przy użyciu polecenia dotnet-dump. W związku z tym należy najpierw zainstalować narzędzie. Jak wspomniano wcześniej, polecenie instalacji dotnet-dump jako narzędzia globalnego to dotnet tool install -g dotnet-dump
.
Po zakończeniu instalacji możesz rozpocząć eksplorowanie podstawowych plików zrzutu. Otwórz plik zrzutu podstawowego przy użyciu polecenia dotnet-dump. Podobnie jak w poprzednim laboratorium, uruchom następujące polecenie:
dotnet-dump analyze ~/dumps/coredump.manual.1.11724
Spróbuj uruchomić polecenie clrthreads
, aby wyświetlić zarządzane wątki. Oczekuje się, że to polecenie zakończy się niepowodzeniem i wygeneruje następujący komunikat o błędzie.
Komunikat o błędzie wygląda następująco:
Nie można załadować ani zainicjować mscordaccore.dll. Docelowe środowisko uruchomieniowe może nie zostać zainicjowane.
Ten błąd występuje, ponieważ wymagane środowisko uruchomieniowe platformy .NET Core nie jest zainstalowane na maszynie wirtualnej z systemem Linux. Jak wyjaśniono w artykule Debugowanie zrzutów systemu Linux, aby przeanalizować zrzuty platformy .NET Core, zarówno llDB, jak i SOS wymagają następujących plików binarnych platformy .NET Core ze środowiska, w których został utworzony plik zrzutu:
- libmscordaccore.so
- libcoreclr.so
- dotnet (host używany do uruchamiania aplikacji)
Nie było to problemu we wcześniejszych laboratoriach rozwiązywania problemów, ponieważ przeanalizowano pliki zrzutu na tej samej maszynie wirtualnej, na której była hostowana i uruchomiona aplikacja. W związku z tym pliki były już obecne. Teraz musisz skopiować poprawną wersję tych plików z innego miejsca (na przykład z maszyny wirtualnej, na której pobrano podstawowe pliki zrzutu), albo zainstalować to samo środowisko uruchomieniowe platformy .NET na maszynie wirtualnej z systemem Linux WSL2.
Istnieje kilka metod określania docelowego środowiska uruchomieniowego platformy .NET Core. Najłatwiej jest poprosić właściciela aplikacji. Jeśli jesteś właścicielem, znasz docelowe środowisko uruchomieniowe platformy .NET Core aplikacji. Co zrobić, jeśli w ogóle nie masz tych informacji? W takim przypadku można użyć polecenia lm
rozszerzenia SOS lub modules
, które wyświetla listę modułów natywnych załadowanych w procesie. Uruchom to polecenie, aby określić wersję instalacji platformy .NET.
Jak pokazano na tym zrzucie ekranu, środowisko uruchomieniowe platformy .NET Core miało wersję 3.1.10. Potrzebna jest poprawna wersja libmscordaccore.so, libcoreclr.so i .NET. Możesz skopiować te pliki z maszyny wirtualnej, na której zostały wygenerowane pliki zrzutu podstawowego.
Czy istnieje inny sposób, aby osiągnąć ten sam wynik? Na przykład czy można zainstalować środowisko uruchomieniowe platformy .NET Core w wersji 3.1.10, aby mieć te pliki? Krótka odpowiedź brzmi tak, możesz. Nie można go jednak zainstalować za pomocą sudo apt install dotnet-runtime-3.1.10
polecenia .
Zamiast tego można zainstalować środowisko uruchomieniowe platformy .NET Core 3.1. Jednak ta wersja zainstaluje najnowszą wersję platformy .NET Core 3.1 (.NET Core 3.1.15 w momencie napisania tego artykułu).
Nie będzie to działać, ponieważ podstawowy plik zrzutu jest przeznaczony dla procesu platformy .NET Core 3.1.10. Musisz mieć zgodną wersję tych wymaganych plików.
Na szczęście istnieje narzędzie dotnet-symbol, które może pobierać pliki (symbole, DAC, moduły itd.), które są wymagane do debugowania plików zrzutu podstawowego. Możesz przypomnieć sobie to narzędzie z naszych wcześniejszych sekcji. Aby zainstalować to narzędzie, uruchom dotnet tool install -g dotnet-symbol
polecenie .
Teraz musisz poprosić narzędzie dotnet-symbol o pobranie niezbędnych plików przeznaczonych dla naszego podstawowego pliku zrzutu. Spowoduje to przekazanie nazwy pliku zrzutu podstawowego i innych niezbędnych parametrów: dotnet-symbol --host-only --debugging ~/dumps/coredump.manual.1.11724
.
Ostatnie dwa błędy na liście można zignorować. Niezbędne pliki są pobierane do folderu ~/zrzutów .
Otwórz plik zrzutu podstawowego przy użyciu polecenia dotnet-dump i spróbuj uruchomić te same clrthreads
polecenia.
Teraz powinno być możliwe otwarcie podstawowego pliku zrzutu na maszynie wirtualnej z systemem Windows przy użyciu protokołu WSL2.
Otwieranie plików zrzutu w usłudze lldb
Te kroki są takie same jak w poprzednich laboratoriach rozwiązywania problemów. Ważne części zostały już omówione wcześniej, aby uzyskać niezbędne pliki do debugowania podstawowych plików zrzutu przy użyciu polecenia dotnet-dump. Procedura jest taka sama w przypadku usługi LLDB. Jeśli chcesz zainstalować bazę danych lldb i używać jej do debugowania, sprawdź poprzednie laboratoria.
Jeśli element dotnet-symbol nie może znaleźć niezbędnych plików
Symbol Dotnet będzie działać dla większości podstawowych plików zrzutu. Jeśli z jakiegoś powodu nie można pobrać niezbędnych plików, istnieją sposoby obejścia blokady. Pliki binarne można pobrać i wyodrębnić z oficjalnej strony internetowej firmy Microsoft. Następnie ręcznie skopiuj niezbędne pliki do tego samego folderu, który zawiera podstawowy plik zrzutu.
Jeśli na przykład potrzebujesz plików dla platformy .NET Core 3.1.10 x64, możesz pobrać pliki binarne z tego środowiska uruchomieniowego ASP.NET Core 3.1 (wersja 3.1.10) — strona pobierania plików binarnych systemu Linux x64 i skopiować pliki ręcznie:
- .\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
Jeśli docelowa wersja środowiska uruchomieniowego jest prywatna (pamiętaj, że platforma .NET Core jest oprogramowaniem open source i możesz utworzyć własną wersję prywatną), musisz skopiować te pliki z maszyny wirtualnej z systemem Linux, na której został wygenerowany podstawowy plik zrzutu.