Inspección de seguimientos de la pila administrada (dotnet-stack)
Este artículo se aplica a: ✔️ dotnet-stack
versión 5.0.221401 y posteriores
Instalar
Hay dos maneras de descargar e instalar dotnet-stack
:
Herramienta global dotnet:
Para instalar la versión de lanzamiento más reciente del paquete NuGet de
dotnet-stack
, use el comando dotnet tool install:dotnet tool install --global dotnet-stack
Descarga directa:
descargue el archivo ejecutable de la herramienta que coincida con la plataforma:
SO Plataforma Windows x86 | x64 | Arm | Arm-x64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Sinopsis
dotnet-stack [-h, --help] [--version] <command>
Descripción
La herramienta dotnet-stack
:
- Es una herramienta de .NET Core para varias plataformas.
- Captura e imprime las pilas administradas para todos los subprocesos del proceso de .NET de destino.
- Utiliza el seguimiento
EventPipe
que proporciona el entorno de ejecución de .NET Core.
Opciones
-h|--help
Muestra la ayuda de la línea de comandos.
--version
Muestra la versión de la utilidad dotnet-stack.
Comandos:
Command | Descripción |
---|---|
dotnet-stack report | Imprime el seguimiento de la pila para cada subproceso del proceso de destino. |
dotnet-stack ps | Enumera los procesos de dotnet de los que se pueden recopilar seguimientos de la pila. |
dotnet-stack symbolicate | Obtenga el número de línea del token de método y el desplazamiento IL en un seguimiento de pila. |
dotnet-stack report
Imprime el seguimiento de la pila para cada subproceso del proceso de destino.
Sinopsis
dotnet-stack report -p|--process-id <pid>
-n|--name <process-name>
[-h|--help]
Opciones
-n, --name <name>
Nombre del proceso desde el que se va a notificar la pila.
-p|--process-id <PID>
Id. de proceso desde el que se va a notificar la pila.
dotnet-stack ps
Enumera los procesos de dotnet de los que se pueden recopilar seguimientos de la pila.
dotnet-stack
, versión 6.0.320703 y posteriores, también muestra los argumentos de la línea de comandos con los que se ha iniciado cada proceso, si está disponible.
Sinopsis
dotnet-stack ps [-h|--help]
Ejemplo
Imagine que inicia una aplicación de ejecución prolongada con el comando dotnet run --configuration Release
. En otra ventana ejecuta el comando dotnet-stack ps
. La salida que se ve es la siguiente. Los argumentos de la línea de comandos, si los hay, se muestran en dotnet-stack
versión 6.0.320703 y posteriores.
> 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
Obtenga el número de línea del token de método y el desplazamiento IL en un seguimiento de pila.
Sinopsis
dotnet-stack symbolicate <input-path> [-d|--search-dir] [-o|--output] [-c|--stdout] [-h|--help]
Opciones
-d, --search-dir <directory1 directory2 ...>
Ruta de acceso de varios directorios con ensamblado y pdb.
-o, --output <output-path>
Salida directa a un archivo.
-c, --stdout
Salida directa a una consola.
Ejemplo
> 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
Informe de pilas administradas con dotnet-stack
Para notificar pilas administradas mediante dotnet-stack
, haga lo siguiente:
Averigüe el identificador de proceso (PID) de la aplicación .NET Core del que se van a notificar pilas.
- En Windows, puede usar el administrador de tareas o el comando
tasklist
, por ejemplo. - En Linux, por ejemplo, el comando
ps
. - dotnet-stack ps
- En Windows, puede usar el administrador de tareas o el comando
Ejecute el siguiente comando:
dotnet-stack report --process-id <PID>
El comando anterior genera una salida similar a la siguiente:
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[])
La salida de
dotnet-stack
tiene el formato siguiente:- Los comentarios de la salida incluyen el prefijo
#
. - Cada subproceso tiene un encabezado que incluye el id. de subproceso nativo:
Thread (<thread-id>):
. - Los marcos de pila siguen el formato
Module!Method
. - En la salida, las transiciones a código no administrado se representan como
[Native Frames]
.
# comment Thread (0x1234): module!Method module!Method Thread (0x5678): [Native Frames] Module!Method Module!Method
- Los comentarios de la salida incluyen el prefijo
Nota
La detención del proceso puede llevar mucho tiempo (hasta varios minutos) en el caso de las aplicaciones de tamaño muy grande. El runtime debe enviar información sobre el tipo y el método de todo el código administrado que se ha capturado para resolver los nombres de función.