Herramienta de análisis del montón (dotnet-gcdump)

Este artículo se aplica a: ✔️ dotnet-gcdump versión 3.1.57502 y posteriores

Instalar

Hay dos maneras de descargar e instalar dotnet-gcdump:

  • Herramienta global dotnet:

    Para instalar la versión de lanzamiento más reciente del paquete NuGet de dotnet-gcdump, use el comando dotnet tool install:

    dotnet tool install --global dotnet-gcdump
    
  • Descarga directa:

    descargue el archivo ejecutable de la herramienta que coincida con la plataforma:

    SO Plataforma
    Windows x86 | x64 | Arm | Arm64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Nota

Para usar dotnet-gcdump en una aplicación x86, necesita la versión x86 correspondiente de la herramienta.

Sinopsis

dotnet-gcdump [-h|--help] [--version] <command>

Descripción

La herramienta global dotnet-gcdump recopila volcados de memoria de GC (recolector de elementos no utilizados) de procesos de .NET en vivo mediante EventPipe. Los volcados de memoria de GC se crean desencadenando un GC en el proceso de destino, activando eventos especiales y regenerando el gráfico de raíces de objeto a partir del flujo de eventos. Este proceso permite recopilar volcados de memoria de GC mientras el proceso se está ejecutando y con una sobrecarga mínima. Estos volcados de memoria son útiles para varios escenarios:

  • Comparar el número de objetos del montón en varios puntos en el tiempo.
  • Analizar raíces de objetos (responder a preguntas como "¿qué sigue teniendo una referencia a este tipo?").
  • Recopilar estadísticas generales sobre los recuentos de objetos en el montón.

Ver el volcado de memoria de GC capturado por dotnet-gcdump

En Windows, los archivos .gcdump se pueden ver en PerfView o en Visual Studio para analizarlos. Actualmente, no es posible abrir .gcdump en plataformas que no sean de Windows.

Puede recopilar varios archivos .gcdump y abrirlos simultáneamente en Visual Studio para obtener una comparativa.

Opciones

  • --version

    Muestra la versión del servicio dotnet-gcdump.

  • -h|--help

    Muestra la ayuda de la línea de comandos.

Comandos

Get-Help
dotnet-gcdump collect
dotnet-gcdump ps
dotnet-gcdump report

dotnet-gcdump collect

Recopila un volcado de memoria de GC de un proceso que se está ejecutando actualmente.

Advertencia

Para recorrer el montón de GC, este comando desencadena una recolección de elementos no utilizados de generación 2 (completa), que puede suspender el entorno de ejecución durante mucho tiempo, especialmente cuando el montón de GC es grande. No utilice este comando en entornos sensibles al rendimiento cuando el montón de GC sea grande.

Sinopsis

dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]

Opciones

  • -h|--help

    Muestra la ayuda de la línea de comandos.

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

    Identificador del proceso del que se va a recopilar el volcado de memoria de GC.

  • -o|--output <gcdump-file-path>

    Ruta de acceso donde se deben escribir los volcados de memoria de GC recopilados. El valor predeterminado es .\YYYYMMDD_HHMMSS_<pid>.gcdump.

  • -v|--verbose

    Obtener resultados del registro mientras recopila el volcado de memoria de GC.

  • -t|--timeout <timeout>

    Dejar de recopilar el volcado de memoria de GC si tarda más de la cantidad de segundos indicada. El valor predeterminado es 30.

  • -n|--name <name>

    Nombre del proceso del que se va a recopilar el volcado de memoria de GC.

Nota

En Linux y macOS, este comando espera que la aplicación de destino y dotnet-gcdump compartan la misma variable de entorno TMPDIR. De lo contrario, se agotará el tiempo de espera del comando.

Nota

Para recopilar un volcado de recolección de elementos no utilizados mediante dotnet-gcdump, debe ejecutarse como el mismo usuario que el que ejecuta el proceso de destino, o bien como usuario raíz. De lo contrario, la herramienta no podrá establecer una conexión con el proceso de destino.

dotnet-gcdump ps

Enumera los procesos de dotnet de los que se pueden recopilar volcados de memoria de GC. dotnet-gcdump 6.0.320703 y posterior también muestra los argumentos de la línea de comandos con los que se ha iniciado cada proceso, si están disponibles.

Sinopsis

dotnet-gcdump 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-gcdump ps. La salida que se ve es la siguiente. Los argumentos de la línea de comandos, si los hay, se muestran mediante dotnet-gcdump, versión 6.0.320703 y posteriores.

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

dotnet-gcdump report <gcdump_filename>

Crear un informe a partir de un volcado de memoria de GC generado anteriormente o de un proceso en ejecución y escribir en stdout.

Sinopsis

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

Opciones

  • -h|--help

    Muestra la ayuda de la línea de comandos.

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

    Identificador del proceso del que se va a recopilar el volcado de memoria de GC.

  • -t|--report-type <HeapStat>

    Tipo de informe que se va a generar. Opciones disponibles: heapstat (predeterminado).

Solución de problemas

  • No hay información de tipo en gcdump.

    Antes de .NET Core 3.1, se producía un problema por el que una memoria caché de tipos no se borraba entre varios gcdump cuando se invocaba con EventPipe. El resultado fue que los eventos necesarios para determinar la información de tipo no se enviaban al segundo gcdump y a los siguientes. Esto se corrigió en la versión preliminar 2 de .NET Core 3.1.

  • Los tipos COM y estáticos no se encuentran en el volcado de memoria de GC.

    Antes de .NET Core 3.1 había un problema que consistía en que los tipos estáticos y COM no se enviaban cuando se invocaba el volcado de memoria de recolección de elementos no utilizados por medio de EventPipe. Esto se ha corregido en .NET Core 3.1.

  • dotnet-gcdump no puede generar un archivo .gcdump debido a la falta de información, por ejemplo, [Error] Excepción durante gcdump: System.ApplicationException: el archivo ETL muestra el inicio de un volcado de memoria del montón, pero no su finalización. O bien, el archivo .gcdump no incluye todo el montón.

    dotnet-gcdump trabaja en la recopilación de un seguimiento de eventos emitidos por el recolector de elementos no utilizados durante una recolección de generación 2 inducida. Si el montón es lo suficientemente grande o no hay suficiente memoria para escalar los búferes de eventos, se pueden quitar los eventos necesarios para reconstruir el grafo del montón del seguimiento. En este caso, para diagnosticar problemas en el montón, se recomienda recopilar un volcado de memoria del proceso.

  • dotnet-gcdump parece provocar un problema de memoria insuficiente en un entorno con restricción de memoria.

    dotnet-gcdump trabaja en la recopilación de un seguimiento de eventos emitidos por el recolector de elementos no utilizados durante una recolección de generación 2 inducida. El búfer de la colección de eventos es propiedad de la aplicación de destino y puede crecer hasta 256 MB. dotnet-gcdump también usa memoria. Si el entorno tiene restricción de memoria, asegúrese de tener en cuenta estos factores a la hora de recopilar un volcado de memoria de recolección de elementos no utilizados a fin de evitar errores.