Esaminare le analisi dello stack gestito (dotnet-stack)
Questo articolo si applica a: ✔️ dotnet-stack
versione 5.0.221401 e versioni successive
Installare
Esistono due modi per scaricare e installare dotnet-stack
:
Strumento globale dotnet:
Per installare la versione più recente del
dotnet-stack
pacchetto NuGet, usare il comando dotnet tool install:dotnet tool install --global dotnet-stack
Download diretto:
Scaricare lo strumento eseguibile corrispondente alla piattaforma:
Sistema operativo Piattaforma Finestre x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Riepilogo
dotnet-stack [-h, --help] [--version] <command>
Descrizione
Lo strumento dotnet-stack
:
- è uno strumento .NET Core multipiattaforma.
- Acquisisce e stampa gli stack gestiti per tutti i thread nel processo .NET di destinazione.
- Usa la traccia
EventPipe
fornita dal runtime di .NET Core.
Opzioni
-h|--help
Mostra la Guida della riga di comando.
--version
Visualizza la versione dell'utilità dotnet-stack.
Comandi
Comando | Descrizione |
---|---|
report dotnet-stack | Stampa l'analisi dello stack per ogni thread nel processo di destinazione. |
dotnet-stack ps | Elenca i processi dotnet da cui è possibile raccogliere le analisi dello stack. |
dotnet-stack simbolica | Ottenere il numero di riga dal token del metodo e dall'offset IL in uno stacktrace. |
report dotnet-stack
Stampa l'analisi dello stack per ogni thread nel processo di destinazione.
Riepilogo
dotnet-stack report -p|--process-id <pid>
-n|--name <process-name>
[-h|--help]
Opzioni
-n, --name <name>
Nome del processo da cui segnalare lo stack.
-p|--process-id <PID>
ID del processo da cui segnalare lo stack.
dotnet-stack ps
Elenca i processi dotnet da cui è possibile raccogliere le analisi dello stack.
La versione 6.0.320703 di dotnet-stack
e versioni successive visualizza anche gli argomenti della riga di comando con cui è stato avviato ogni processo, se disponibile.
Riepilogo
dotnet-stack ps [-h|--help]
Esempio
Si supponga di avviare un'app a esecuzione prolungata usando il comando dotnet run --configuration Release
. In un'altra finestra si esegue il comando dotnet-stack ps
. L'output visualizzato è il seguente. Gli argomenti della riga di comando, se presenti, vengono visualizzati nella versione 6.0.320703 di dotnet-stack
e versioni successive.
> dotnet-stack ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-stack simbolica
Ottenere il numero di riga dal token del metodo e dall'offset IL in uno stacktrace.
Riepilogo
dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]
Opzioni
-d, --search-dir <directory1 directory2 ...>
Percorso di più directory con assembly e pdb.
-o, --output <output-path>
Output diretto a un file.
-c, --stdout
Output diretto a una console.
Esempio
> cat stack.trace
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in DotnetStackSymbolicate.dll:token 0x6000002+0x6
at DotnetStackSymbolicate.App..ctor() in DotnetStackSymbolicate.dll:token 0x6000003+0x51
at DotnetStackSymbolicate.Program.OnCreate() in DotnetStackSymbolicate.Tizen.dll:token 0x6000001+0x8
onSigabrt called
>
> dotnet-stack symbolicate stack.trace --stdout
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
at DotnetStackSymbolicate.App.MethodA() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 19
at DotnetStackSymbolicate.App..ctor() in C:\DotnetStackSymbolicate\DotnetStackSymbolicate.cs:line 38
at DotnetStackSymbolicate.Program.OnCreate() in C:\DotnetStackSymbolicate.Tizen\DotnetStackSymbolicate.Tizen.cs:line 12
onSigabrt called
Output: stack.trace.symbolicated
Stack gestiti di report con dotnet-stack
Per segnalare gli stack gestiti tramite dotnet-stack
:
Ottenere l'identificatore del processo (PID) dell'applicazione .NET Core da cui segnalare gli stack.
- Ad esempio, in Windows è possibile usare Gestione attività o il comando
tasklist
. - In Linux, ad esempio, il comando
ps
. - dotnet-stack ps
- Ad esempio, in Windows è possibile usare Gestione attività o il comando
Esegui questo comando:
dotnet-stack report --process-id <PID>
Il comando precedente genera un output simile al seguente:
Thread (0x48839B): [Native Frames] System.Console!System.IO.StdInReader.ReadKey(bool&) System.Console!System.IO.SyncTextReader.ReadKey(bool&) System.Console!System.ConsolePal.ReadKey(bool) System.Console!System.Console.ReadKey() StackTracee!Tracee.Program.Main(class System.String[])
L'output di
dotnet-stack
segue il formato seguente:- I commenti nell'output sono preceduti da
#
. - Ogni thread ha un'intestazione che include l'ID thread nativo:
Thread (<thread-id>):
. - Gli stack frame seguono il formato
Module!Method
. - Le transizioni al codice non gestito vengono rappresentate come
[Native Frames]
nell'output.
# comment Thread (0x1234): module!Method module!Method Thread (0x5678): [Native Frames] Module!Method Module!Method
- I commenti nell'output sono preceduti da
Nota
L'arresto del processo può richiedere molto tempo (fino a diversi minuti) per le applicazioni molto grandi. Il runtime deve inviare le informazioni sul tipo e sul metodo per tutto il codice gestito che è stato acquisito al fine di risolvere i nomi delle funzioni.