Compartilhar via


Inspecionar rastreamentos de pilha gerenciados (dotnet-stack)

Este artigo se aplica a: ✔️ dotnet-stack versão 5.0.221401 e versões posteriores

Instalar

Há duas maneiras de baixar e instalar o dotnet-stack:

Sinopse

dotnet-stack [-h, --help] [--version] <command>

Descrição

A ferramenta dotnet-stack:

  • É uma ferramenta .NET Core multiplataforma.
  • Captura e imprime as pilhas gerenciadas para todos os threads no processo .NET de destino.
  • Utiliza o rastreamento EventPipe fornecido pelo runtime do .NET Core.

Opções

  • -h|--help

    Mostra a ajuda da linha de comando.

  • --version

    Exibe a versão do utilitário dotnet-stack.

Comandos

Comando Descrição
dotnet-stack report Imprime o rastreamento de pilha para cada thread no processo de destino.
dotnet-stack ps Lista os processos de dotnet dos quais os rastreamentos de pilha podem ser coletados.
dotnet-stack symbolicate Obtenha o número de linha do Token de Método e do Deslocamento do IL em um rastreamento de pilha.

dotnet-stack report

Imprime o rastreamento de pilha para cada thread no processo de destino.

Sinopse

dotnet-stack report -p|--process-id <pid>
                    -n|--name <process-name>
                    [-h|--help]

Opções

  • -n, --name <name>

    O nome do processo do qual relatar a pilha.

  • -p|--process-id <PID>

    A ID do processo da qual relatar a pilha.

dotnet-stack ps

Lista os processos de dotnet dos quais os rastreamentos de pilha podem ser coletados. dotnet-stack versão 6.0.320703 e posteriores também exibem os argumentos de linha de comando com os quais cada processo foi iniciado, se disponível.

Sinopse

dotnet-stack ps [-h|--help]

Exemplo

Suponha que você inicie um aplicativo de longa execução usando o comando dotnet run --configuration Release. Em outra janela, execute o aplicativo de longa execução usando o comando dotnet-stack ps. A saída que você verá é a seguinte. Os argumentos de linha de comando, se houver, são mostrados no dotnet-stack versão 6.0.320703 e posterior.

> dotnet-stack ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

dotnet-stack symbolicate

Obtenha o número de linha do Token de Método e do Deslocamento do IL em um rastreamento de pilha.

Sinopse

dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]

Opções

  • -d, --search-dir <directory1 directory2 ...>

    Caminho de vários diretórios com assembly e pdb.

  • -o, --output <output-path>

    Saída diretamente para um arquivo.

  • -c, --stdout

    Saída diretamente para um console.

Exemplo

> 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

Relatar pilhas gerenciadas com dotnet-stack

Para relatar pilhas gerenciadas usando dotnet-stack:

  • Obtenha o PID (identificador de processo) do aplicativo .NET Core do qual relatar pilhas.

    • No Windows, você pode usar o Gerenciador de Tarefas ou o comando tasklist, por exemplo.
    • No Linux, por exemplo, o comando ps.
    • dotnet-stack ps
  • Execute o comando a seguir:

    dotnet-stack report --process-id <PID>
    

    O comando anterior gera uma saída semelhante à seguinte:

    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[])
    

    A saída dotnet-stack segue o seguinte formulário:

    • Os comentários na saída são prefixados com #.
    • Cada thread tem um cabeçalho que inclui a ID do thread nativo: Thread (<thread-id>):.
    • Os quadros de pilha seguem o formulário Module!Method.
    • As transições para código não gerenciado são representadas como [Native Frames] na saída.
    # comment
    Thread (0x1234):
      module!Method
      module!Method
    
    Thread (0x5678):
      [Native Frames]
      Module!Method
      Module!Method
    

Observação

Parar o processo pode levar muito tempo (até vários minutos) para aplicativos muito grandes. O runtime precisa enviar informações de tipo e método para todo o código gerenciado que foi capturado para resolver nomes de função.

Próximas etapas