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

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.

Pasos siguientes