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.