Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo se aplica a: ✔️ versión 3.0.47001 y posteriores
Nota
dotnet-dump para macOS solo se admite con .NET 5 y versiones posteriores.
Instalar
Hay dos maneras de descargar e instalar :
Herramienta global dotnet:
Para instalar la versión de lanzamiento más reciente del de , use el comando dotnet tool install:
dotnet tool install --global dotnet-dumpDescarga directa:
descargue el archivo ejecutable de la herramienta que coincida con la plataforma:
SO Plataforma Windows x86x64BrazoArm-x64 Linux x64BrazoArm64musl-x64musl-Arm64
Nota
Para usar en una aplicación x86, necesita la versión x86 correspondiente de la herramienta.
Sinopsis
dotnet-dump [-h|--help] [--version] <command>
Descripción
La herramienta global dotnet-dump es una manera de recopilar y analizar volcados de memoria en Windows, Linux y macOS sin ningún depurador nativo implicado. Esta herramienta es importante en plataformas como Alpine Linux, donde no está disponible una versión de totalmente operativa. La herramienta permite ejecutar comandos SOS para analizar bloqueos y el recolector de elementos no utilizados (GC), pero no es un depurador nativo, por lo que no se admiten elementos como la visualización de marcos de pila nativos.
Opciones
--versionMuestra la versión de la utilidad dotnet-dump.
-h|--helpMuestra la ayuda de la línea de comandos.
Comandos
| Comando |
|---|
| dotnet-dump collect |
| análisis de dotnet-dump |
| dotnet-dump ps |
dotnet-dump collect
Captura un volcado de un proceso.
Sinopsis
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Opciones
-h|--helpMuestra la ayuda de la línea de comandos.
-p|--process-id <PID>Especifica el número de id. de proceso del que se va a recopilar un volcado.
-n|--name <name>Especifica el nombre del proceso del que se va a recopilar un volcado.
--type <Full|Heap|Mini>Especifica el tipo de volcado, que determina los tipos de información que se recopilan del proceso. Existen tres tipos:
- : el volcado más grande que contiene toda la memoria, incluidas las imágenes de los módulos.
- : un volcado grande y relativamente completo que contiene listas de módulos, listas de subprocesos, todas las pilas, información de excepción, información de control y toda la memoria excepto las imágenes asignadas.
- : un volcado pequeño que contiene listas de módulos, listas de subprocesos, información de excepción y todas las pilas.
- - Un pequeño volcado de memoria que contiene listas de módulos, listas de subprocesos, información de excepciones, todas las pilas y PII quitadas.
Si no se especifica, el valor predeterminado es .
-o|--output <output_dump_path>La ruta de acceso completa y el nombre de archivo donde se debe escribir el volcado recopilado. Asegúrese de que el usuario con el que se ejecuta el proceso dotnet tiene permisos de escritura en el directorio especificado.
Si no se especifica:
- El valor predeterminado es .\dump_YYYYMMDD_HHMMSS.dmp en Windows.
- El valor predeterminado es ./core_AAAAMMDD_HHMMSS en Linux o macOS.
AAAAMMDD es año/mes/día y HHMMSS es hora/minuto/segundo.
--diagHabilita el registro de diagnóstico de la recopilación de volcado.
--crashreportHabilita la generación de informes de bloqueo.
Nota
En Linux y macOS, este comando espera que la aplicación de destino y compartan la misma variable de entorno . De lo contrario, se agotará el tiempo de espera del comando.
Nota
Para recopilar un volcado mediante , 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.
Nota
La recopilación de un volcado de memoria completa o de montón puede hacer que el sistema operativo se pagina en una memoria virtual sustancial para el proceso de destino. Si el proceso de destino se ejecuta en un contenedor con un límite de memoria aplicado, el aumento del uso de memoria puede hacer que el sistema operativo finalice el contenedor si se ha superado el límite. Se recomienda realizar pruebas para asegurarse de que el límite de memoria esté establecido lo suficientemente alto. Otra opción consiste en cambiar o quitar temporalmente el límite antes de la recopilación de volcados si el entorno admite hacerlo.
análisis de dotnet-dump
Inicia un shell interactivo para explorar un volcado. El shell acepta varios comandos SOS.
Sinopsis
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Argumentos
<dump_path>Especifica la ruta de acceso al archivo de volcado que se va a analizar.
Opciones
-c|--command <debug_command>Ejecuta el comando al iniciarse. Se pueden usar varias instancias de este parámetro en una invocación para encadenar comandos. Los comandos se ejecutarán en el orden en que se proporcionan en la línea de comandos. Si desea que el volcado de dotnet salga después de los comandos, el último comando debe ser "exit".
Análisis de comandos SOS
| Comando | Función |
|---|---|
analyzeoom |
Muestra la información del último OOM que se produjo en una solicitud de asignación al montón de GC. |
clrmodules |
Enumera los módulos administrados en el proceso. |
clrstack |
Proporciona un seguimiento de pila del código administrado únicamente. |
clrthreads |
Enumera los subprocesos administrados que se están ejecutando. |
clru |
Muestra un desensamblado anotado de un método administrado. |
| o | Vuelca el contenido de la memoria. |
dbgout |
Habilita o deshabilita el registro de SOS interno (). |
dso |
Muestra todos los objetos administrados que se han encontrado dentro de los límites de la pila actual. |
dumpalc |
Muestra detalles sobre un AssemblyLoadContext recopilable al que se carga el objeto especificado. |
dumparray |
Muestra detalles sobre una matriz administrada. |
dumpasync |
Muestra información sobre las máquinas de estados asincrónicas en el montón de recolección de elementos no utilizados. |
dumpassembly |
Muestra detalles sobre un ensamblado. |
dumpclass |
Muestra información sobre la estructura en la dirección especificada. |
dumpconcurrentdictionary |
Muestra el contenido del diccionario simultáneo. |
dumpconcurrentqueue |
Muestra el contenido de la cola simultánea. |
dumpdelegate |
Muestra información sobre un delegado. |
dumpdomain |
Muestra información acerca de todos los ensamblados dentro de los dominios de aplicación o el dominio especificado. |
dumpgcdata |
Muestra información sobre los datos de GC. |
dumpgen |
Muestra el contenido del montón para la generación especificada. |
dumpheap |
Muestra información sobre el montón de recolección de elementos no utilizados y estadísticas de recolección de los objetos. |
dumpil |
Muestra el lenguaje intermedio común (CIL) asociado a un método administrado. |
dumplog |
Escribe el contenido de un registro de esfuerzo existente en memoria en el archivo especificado. |
dumpmd |
Muestra información sobre la estructura en la dirección especificada. |
dumpmodule |
Muestra información sobre el módulo en la dirección especificada. |
dumpmt |
Muestra información sobre la tabla de métodos en la dirección especificada. |
dumpobj |
Muestra información sobre el objeto en la dirección especificada. |
dumpruntimetypes |
Busca todos los objetos System.RuntimeType en el montón de GC e imprime el nombre de tipo y MethodTable al que hacen referencia. |
dumpsig |
Vuelca la firma de un método o campo especificado por . |
dumpsigelem |
Vuelca un único elemento de un objeto de firma. |
dumpstackobjects |
Muestra todos los objetos administrados que se han encontrado dentro de los límites de la pila actual. |
dumpvc |
Muestra información sobre los campos de una clase de valor. |
eeheap |
Muestra información sobre la memoria de proceso que usan las estructuras de datos internas del runtime. |
eestack |
Ejecuta el comando en todos los subprocesos del proceso. |
eeversion |
Muestra información sobre el tiempo de ejecución y las versiones SOS. |
ehinfo |
Muestra los bloques de control de excepciones de un método JIT. |
| o | Sale del modo interactivo. |
finalizequeue |
Muestra todos los objetos registrados para su finalización. |
findappdomain |
Intenta resolver el dominio de aplicación de un objeto GC. |
gchandles |
Muestra estadísticas acerca de los identificadores del recolector de elementos no utilizados existentes en el proceso. |
gcheapstat |
Muestra estadísticas sobre el recolector de elementos no utilizados. |
gcinfo |
Muestra la codificación JIT de recolección de elementos no utilizados para un método. |
gcroot |
Muestra información sobre las referencias (o raíces) al objeto en la dirección especificada. |
gcwhere |
Muestra la ubicación en el montón de recolección de elementos no utilizados de la dirección especificada. |
histclear |
Libera los recursos usados por la familia de comandos Hist. |
histinit |
Inicializa las estructuras SOS del registro de esfuerzo guardado en el código que se está depurando. |
histobj |
Examina todos los registros de reubicación del registro de esfuerzo y muestra la cadena de reubicaciones de recolección de elementos no utilizados que pueden haber conducido a la dirección que se ha pasado como argumento. |
histobjfind |
Muestra todas las entradas de registro que hacen referencia al objeto en la dirección especificada. |
histroot |
Muestra información relacionada con las promociones y las reubicaciones de la raíz especificada. |
histstats |
Muestra las estadísticas del registro de esfuerzo. |
ip2md |
Muestra la estructura en la dirección especificada en el código compilado JIT. |
listnearobj |
Muestra los objetos anteriores y posteriores a la dirección especificada. |
logopen |
Habilita el registro de archivos de la consola. |
logclose |
Deshabilita el registro de archivos de la consola. |
logging |
Habilita o deshabilita el registro de SOS interno. |
| o | Muestra los módulos nativos del proceso. |
name2ee |
Muestra las estructuras y para el tipo o método especificado del módulo indicado. |
objsize |
Muestra el tamaño del objeto especificado. |
parallelstacks |
Muestra la pila de subprocesos combinados de forma similar al panel Visual Studio "Pilas paralelas". |
pathto |
Muestra la ruta de acceso de GC de a . |
| o | Muestra y da formato a los campos de cualquier objeto derivado de la clase en la dirección especificada. |
| o | Muestra los registros del subproceso. |
runtimes |
Enumera los runtimes en el destino o cambia el runtime predeterminado. |
setclrpath |
Establece la ruta de acceso para cargar archivos dac o dbi de CoreCLR mediante . |
setsymbolserver |
Habilita la compatibilidad con el servidor de símbolos. |
sos |
Ejecuta varios comandos de depuración de CoreCLR. Usa la sintaxis . Para obtener más información, vea "soshelp". |
| o | Muestra todos los comandos disponibles. |
| o | Muestra el comando especificado. |
syncblk |
Muestra la información del contenedor de SyncBlock. |
taskstate |
Muestra un estado de tarea en un formato legible para el ser humano. |
threadpool |
Muestra información sobre el grupo de subprocesos de runtime. |
threadpoolqueue |
Muestra los elementos de trabajo del grupo de subprocesos en cola. |
threadstate |
Imprime el significado de un estado de subprocesos. |
| o | Establece o muestra el identificador del subproceso actual para los comandos SOS. |
timerinfo |
Muestra información sobre los temporizadores de ejecución. |
token2ee |
Muestra la estructura MethodTable y la estructura MethodDesc para el token y el módulo especificados. |
traverseheap |
Escribe información del montón en el archivo especificado, en un formato reconocido por el CLR Profiler. |
verifyheap |
Comprueba el montón de GC para ver si hay signos de daños. |
verifyobj |
Comprueba el objeto que se pasa como argumento en busca de indicios de daños. |
Nota
Puede encontrar más detalles en SOS Debugging Extension for .NET.
dotnet-dump ps
Enumera los procesos de dotnet de los que se pueden recolectar volcados de memoria. 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-dump ps [-h|--help]
Ejemplo
Imagine que inicia una aplicación de ejecución prolongada con el comando . En otra ventana ejecuta el comando . La salida que se ve es la siguiente. Los argumentos de la línea de comandos, si los hay, se muestran en versión 6.0.320703 y posteriores.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Uso de
El primer paso es recopilar un volcado. Este paso se puede omitir si ya se ha generado un volcado principal. El sistema operativo o la característica de generación integrada del entorno de ejecución de .NET Core dump pueden crear volcados de núcleo.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Ahora analice el volcado principal con el comando :
$ dotnet-dump analyze ./core_20190226_135850
Loading core dump: ./core_20190226_135850
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
>
Esta acción abre una sesión interactiva que acepta comandos como los siguientes:
> clrstack
OS Thread Id: 0x573d (0)
Child SP IP Call Site
00007FFD28B42C58 00007fb22c1a8ed9 [HelperMethodFrame_PROTECTOBJ: 00007ffd28b42c58] System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.Program.Foo4(System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.Program.Foo2(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.Program.Foo1(Int32, System.String) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.Program.Main(System.String[]) [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
00007FFD28B43210 00007fb22aa9cedf [GCFrame: 00007ffd28b43210]
00007FFD28B43610 00007fb22aa9cedf [GCFrame: 00007ffd28b43610]
Para ver una excepción no controlada que ha terminado la aplicación:
> pe -lines
Exception object: 00007fb18c038590
Exception type: System.Reflection.TargetInvocationException
Message: Exception has been thrown by the target of an invocation.
InnerException: System.Exception, Use !PrintException 00007FB18C038368 to see more.
StackTrace (generated):
SP IP Function
00007FFD28B42DD0 0000000000000000 System.Private.CoreLib.dll!System.RuntimeMethodHandle.InvokeMethod(System.Object, System.Object[], System.Signature, Boolean, Boolean)
00007FFD28B42DD0 00007FB1B1334F67 System.Private.CoreLib.dll!System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)+0xa7 [/root/coreclr/src/mscorlib/src/System/Reflection/RuntimeMethodInfo.cs @ 472]
00007FFD28B42E20 00007FB1B18D33ED SymbolTestApp.dll!SymbolTestApp.Program.Foo4(System.String)+0x15d [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 54]
00007FFD28B42ED0 00007FB1B18D2FC4 SymbolTestApp.dll!SymbolTestApp.Program.Foo2(Int32, System.String)+0x34 [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 29]
00007FFD28B42F00 00007FB1B18D2F5A SymbolTestApp.dll!SymbolTestApp.Program.Foo1(Int32, System.String)+0x3a [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 24]
00007FFD28B42F30 00007FB1B18D168E SymbolTestApp.dll!SymbolTestApp.Program.Main(System.String[])+0x6e [/home/mikem/builds/SymbolTestApp/SymbolTestApp/SymbolTestApp.cs @ 19]
StackTraceString: <none>
HResult: 80131604
Análisis de pérdidas de memoria y asignaciones
Las pérdidas de memoria se producen cuando la aplicación contiene referencias a objetos que ya no son necesarios, lo que impide que el recolector de elementos no utilizados recupere memoria. Use para identificar fugas de memoria, buscar los objetos más grandes y comprender dónde se consume la memoria.
Para ver un tutorial completo sobre la depuración de una fuga de memoria, consulte Debug a memory leak in .NET.
Identificación de los objetos más grandes
Use el comando con la opción para ver un resumen de objetos en el montón, ordenados por tamaño total:
> dumpheap -stat
Statistics:
MT Count TotalSize Class Name
00007f6c1eeefba8 576 59904 System.Reflection.RuntimeMethodInfo
00007f6c1dc021c8 1749 95696 System.SByte[]
00000000008c9db0 3847 116080 Free
00007f6c1e784a18 175 128640 System.Char[]
00007f6c1dbf5510 217 133504 System.Object[]
00007f6c1dc014c0 467 416464 System.Byte[]
00007f6c21625038 6 4063376 testwebapi.Controllers.Customer[]
00007f6c20a67498 200000 4800000 testwebapi.Controllers.Customer
00007f6c1dc00f90 206770 19494060 System.String
Total 428516 objects
Esta salida muestra qué tipos consumen más memoria. En este ejemplo, los objetos consumen aproximadamente 19 MB y los objetos consumen aproximadamente 4,8 MB.
Identificación de objetos por espacio de nombres o ensamblado
Para buscar qué módulos o espacios de nombres consumen memoria, use la opción con un nombre de tipo parcial para filtrar los resultados:
> dumpheap -type MyCompany.Data -stat
Statistics:
MT Count TotalSize Class Name
00007f6c21625038 15000 3600000 MyCompany.Data.CustomerRecord
00007f6c21625040 8000 2560000 MyCompany.Data.OrderHistory
00007f6c21625048 2000 960000 MyCompany.Data.ProductCache
Total 25000 objects, 7120000 bytes
Este enfoque le ayuda a identificar qué partes del código base son responsables del consumo de memoria.
Buscar el número más alto de instancias
Para ver qué tipos tienen la mayoría de las instancias, independientemente del tamaño total, examine la columna Recuento en la salida. Los objetos con recuentos de instancias elevadas pueden indicar problemas ineficazs de creación o almacenamiento en caché de objetos:
> dumpheap -stat
Statistics:
MT Count TotalSize Class Name
00007f6c1dc00f90 206770 19494060 System.String
00007f6c20a67498 200000 4800000 testwebapi.Controllers.Customer
00007f6c1dc021c8 1749 95696 System.SByte[]
En este ejemplo se muestran 206 770 instancias y 200 000 instancias.
Análisis de referencias de objetos con gcroot
Después de identificar objetos grandes o numerosos, use para averiguar por qué un objeto no se está recolectiendo de elementos no utilizados. El comando muestra la cadena de referencia de las raíces de GC a un objeto específico:
> dumpheap -mt 00007f6c20a67498
Address MT Size
00007f6ad09421f8 00007f6c20a67498 24
...
> gcroot 00007f6ad09421f8
Thread 3f68:
00007F6795BB58A0 00007F6C1D7D0745 testwebapi.Controllers.CustomerCache.GetAll()
rbx: (interior)
-> 00007F6BDFFFF038 System.Object[]
-> 00007F69D0033570 testwebapi.Controllers.Processor
-> 00007F69D0033588 testwebapi.Controllers.CustomerCache
-> 00007F69D00335A0 System.Collections.Generic.List`1[[testwebapi.Controllers.Customer]]
-> 00007F6C000148A0 testwebapi.Controllers.Customer[]
-> 00007F6AD0942258 testwebapi.Controllers.Customer
Found 1 root.
Esta salida muestra que un objeto mantiene el objeto , lo que le ayuda a identificar el origen de la fuga en el código.
Análisis de la memoria por tamaño de objeto
Use las opciones y para filtrar objetos por tamaño:
> dumpheap -min 100000 -stat
Statistics:
MT Count TotalSize Class Name
00007f6c21625038 6 4063376 testwebapi.Controllers.Customer[]
00007f6c1dc014c0 12 416464 System.Byte[]
Total 18 objects
Este comando solo muestra objetos de más de 100 000 bytes, lo que le ayuda a centrarse en los consumidores de memoria más grandes.
Buscar interbloqueos
Use para diagnosticar situaciones de interbloqueo en las que los subprocesos se bloquean en espera de recursos. Para ver un tutorial de depuración de interbloqueo completo, consulte Debug a deadlock in .NET.
Enumerar todos los subprocesos
Use el comando para ver todos los subprocesos administrados:
> threads
*0 0x1DBFF (121855)
1 0x1DC01 (121857)
2 0x1DC02 (121858)
...
Examen de las pilas de subprocesos
Use para ver las pilas de llamadas de todos los subprocesos:
> clrstack -all
Busque patrones en los que se bloquean varios subprocesos o primitivos de sincronización similares.
Búsqueda de propietarios de bloqueos
Use el comando para ver qué subprocesos contienen bloqueos y qué subprocesos están esperando:
> syncblk
Index SyncBlock MonitorHeld Recursion Owning Thread Info SyncBlock Owner
43 00000246E51268B8 603 1 0000024B713F4E30 5634 28 00000249654b14c0 System.Object
44 00000246E5126908 3 1 0000024B713F47E0 51d4 29 00000249654b14d8 System.Object
La columna MonitorHeld muestra el número de subprocesos que esperan el bloqueo. La columna Información del subproceso propietario muestra qué subproceso posee el bloqueo.
Escenarios avanzados de análisis de memoria
Comparación de varios volcados de memoria
Para comprender el crecimiento de la memoria con el tiempo, recopile varios volcados de memoria y compárelos:
- Recopilar un volcado de línea base:
- Permitir que la aplicación se ejecute y consuma más memoria.
- Recopilar un segundo volcado de memoria:
- Analice los volcados de memoria y compare los resultados.
Busque tipos que tengan significativamente más instancias o tamaños totales mayores en el segundo volcado de memoria.
Análisis de memoria para tipos de objetos específicos
Para volcar todas las instancias de un tipo específico:
> dumpheap -type Customer
Address MT Size
00007f6ad09421f8 00007f6c20a67498 24
00007f6ad0942210 00007f6c20a67498 24
...
A continuación, use para examinar objetos individuales:
> dumpobj 00007f6ad09421f8
Name: testwebapi.Controllers.Customer
MethodTable: 00007f6c20a67498
EEClass: 00007f6c21625000
Size: 24(0x18) bytes
File: /app/testwebapi.dll
Fields:
MT Field Offset Type VT Attr Value Name
00007f6c1dc00f90 4000001 8 System.String 0 instance 00007f6ad09421f0 Name
00007f6c1dbf4c18 4000002 10 System.Int32 1 instance 42 Id
Solución de problemas de recopilación de volcados de memoria
La recopilación de volcados de memoria requiere que el proceso pueda llamar a . Si tiene problemas para recopilar volcados de memoria, es posible que su entorno de ejecución esté configurado para restringir ese tipo de llamadas. Consulte nuestras preguntas más frecuentes sobre volcados de memoria para obtener sugerencias de solución de problemas y posibles soluciones a problemas comunes.
Vea también
- Entrada de blog sobre la recopilación y el análisis de volcados de memoria
- Herramienta de análisis del montón (dotnet-gcdump)