Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a: .NET Core 2.1, .NET Core 3.1, .NET 5
Questo articolo illustra come usare Docker per aprire un file di dump di base in una macchina virtuale Windows.
Prerequisiti
Per completare questa sezione, è necessario avere almeno un file di dump core copiato nella macchina virtuale Windows in qualsiasi cartella.
Obiettivo di questo lab
Si apprenderà come aprire un file di dump di base in un'altra macchina virtuale Linux usando Docker.
Informazioni sui contenitori e Docker
Secondo la documentazione ufficiale di Docker, un contenitore è un'unità standard di software che crea pacchetti di codice e tutte le relative dipendenze in modo che l'applicazione venga eseguita rapidamente e in modo affidabile da un ambiente di elaborazione a un altro. Un'immagine del contenitore Docker è un pacchetto software eseguibile leggero, autonomo e eseguibile che include tutti gli elementi necessari per eseguire un'applicazione: Codice, runtime, strumenti di sistema, librerie di sistema e impostazioni.
È sufficiente usare i contenitori Docker per eseguire e distribuire le applicazioni. È possibile creare contenitori Docker da diverse immagini del sistema operativo, ad esempio Windows Core o Ubuntu. In questo esercizio si creerà un contenitore Ubuntu per analizzare il file di dump principale.
Per creare e usare contenitori Docker in una macchina virtuale Windows, installare Docker Desktop per Windows. L'articolo collegato illustra i requisiti e i passaggi di installazione. In base ai requisiti, Docker usa sottosistema Windows per Linux (WSL) per i contenitori Linux.
Note
Docker può eseguire contenitori Windows e Linux, ma non contemporaneamente. Sarà quindi necessario passare ai contenitori Linux.
Prima di procedere, è consigliabile leggere questo articolo di domande frequenti su Docker per acquisire familiarità con Docker.
Creare un dockerfile
Dopo aver installato Docker Desktop in Windows, è necessario un dockerfile. Un dockerfile è semplicemente un set di istruzioni per creare il contenitore. Il nome del file "dockerfile" fa distinzione tra maiuscole e minuscole e deve essere tutto minuscolo senza alcuna estensione di file.
È possibile eseguire comandi nel contenitore di destinazione usando il comando RUN . Ad esempio, il dockerfile in questa sezione mostra che è possibile usare RUN mkdir /dumps
per eseguire un mkdir /dumps
comando nel sistema operativo del contenitore di destinazione.
Questo esempio mostra il contenuto dockerfile che consente di raggiungere l'obiettivo di questa sezione: Creare un contenitore Ubuntu usando l'immagine Ubuntu più recente, installare l'SDK dotnet più recente, aggiornare il sistema operativo, installare gli strumenti dotnet-dump e dotnet-symbol, copiare ed estrarre i file di dump e scaricare i file necessari usando lo strumento dotnet-symbol in uno dei file di dump principali.
Note
I commenti iniziano con un segno di cancelletto (#). I commenti vengono forniti per ogni riga in modo da poter comprendere le operazioni eseguite da ogni comando.
# 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
Creare un file denominato dockerfile nella stessa directory contenente il file di archiviazione coredumps.tar.gz . Ricorda: il nome del file fa distinzione tra maiuscole e minuscole e non ha estensioni.
Compilare ed eseguire il contenitore Docker
Anche in questo caso, è necessario passare ai contenitori Linux in Docker se esegue contenitori Windows.
Aprire quindi una finestra del prompt dei comandi e passare alla cartella contenente il file coredumps.tar.gz e dockerfile. Per compilare il contenitore Docker, eseguire docker build -t dotnettools .
.
Note
Il -t
parametro significa "tag". Questo nome di tag verrà usato quando si esegue il contenitore Docker.
Il punto (.) alla fine del comando indica che il comando di compilazione Docker userà il dockerfile dalla directory corrente.
Ecco l'output del comando di compilazione. Poiché lo stesso comando è stato eseguito più volte, usa la cache interna per l'immagine di destinazione. La prima volta che si esegue questo comando, i file necessari verranno scaricati e quindi memorizzati nella cache per usarli in un secondo momento quando necessario. Quando si esegue per la prima volta il comando, potrebbe essere necessario del tempo per compilare l'immagine.
Eseguire quindi il contenitore usando il docker container run -it dotnettools /bin/bash
comando .
È tutto. Si è ora all'interno del contenitore Linux appena compilato. Il resto è lo stesso di prima: si aprirà il dump principale usando con lo stesso comando dotnet-dump: dotnet-dump analyze /dumps/coredump.manual.1.11724
. Ecco il risultato dell'ambiente di esempio usato per compilare la serie di training.
È possibile eseguire comandi SOS, ad esempio clrthreads
, per visualizzare i thread gestiti.
A questo momento, è possibile analizzare i file di dump di base in un contenitore Linux usando Docker.