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
:
Ferramenta global dotnet:
Para instalar a versão mais recente do
dotnet-stack
pacote NuGet, use o comando dotnet tool install:dotnet tool install --global dotnet-stack
Download direto:
Baixe o executável da ferramenta que corresponde à sua plataforma:
Sistema operacional Plataforma Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
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
- No Windows, você pode usar o Gerenciador de Tarefas ou o comando
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
- Os comentários na saída são prefixados com
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.