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:

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
  • 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
    

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.

Passaggi successivi