Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo si applica a: ✔️ dotnet-dump versione 3.0.47001 e versioni successive
Nota
dotnet-dump per macOS è supportato solo con .NET 5 e versioni successive.
Installare
Esistono due modi per scaricare e installare dotnet-dump:
Strumento globale dotnet:
Per installare la versione più recente del
dotnet-dumppacchetto NuGet, usare il comando dotnet tool install:dotnet tool install --global dotnet-dumpDownload diretto:
Scaricare lo strumento eseguibile corrispondente alla piattaforma:
Sistema operativo Piattaforma Windows x86 | x64 | Braccio | Arm-x64 Linux x64 | Braccio | Arm64 | musl-x64 | musl-Arm64
Nota
Per usare dotnet-dump in un'app x86, è necessaria una versione x86 corrispondente dello strumento.
Riepilogo
dotnet-dump [-h|--help] [--version] <command>
Descrizione
Lo strumento globale dotnet-dump consente di raccogliere e analizzare i dump in Windows, Linux e macOS senza che sia coinvolto alcun debugger nativo. Questo strumento è importante su piattaforme come Alpine Linux in cui non è disponibile un lavoro lldb completo. Lo strumento dotnet-dump consente di eseguire comandi SOS per analizzare gli arresti anomali e il Garbage Collector (GC), ma non è un debugger nativo, motivo per cui gli elementi come la visualizzazione di stack frame nativi non sono supportati.
Opzioni
--versionVisualizza la versione dell'utilità dotnet-dump.
-h|--helpMostra la Guida della riga di comando.
Comandi
| Comando |
|---|
| raccogli dotnet-dump |
| analizza dotnet-dump |
| ps dotnet-dump |
raccogli dotnet-dump
Acquisisce un dump da un processo.
Riepilogo
dotnet-dump collect [-h|--help] [-p|--process-id] [-n|--name] [--type] [-o|--output] [--diag] [--crashreport]
Opzioni
-h|--helpMostra la Guida della riga di comando.
-p|--process-id <PID>Specifica il numero ID del processo da cui raccogliere un dump.
-n|--name <name>Specifica il nome del processo da cui raccogliere un dump.
--type <Full|Heap|Mini>Specifica il tipo di dump, che determina i tipi di informazioni raccolti dal processo. Sono disponibili tre tipi:
-
Full- Il dump più grande contenente tutta la memoria, incluse le immagini del modulo. -
Heap- Dump di grandi dimensioni e relativamente completo contenente elenchi di moduli, elenchi di thread, tutti gli stack, le informazioni sulle eccezioni, informazioni di gestione e tutta la memoria, a eccezione delle immagini mappate. -
Mini- Un dump di dimensioni limitate contenente elenchi di moduli, elenchi di thread, informazioni sulle eccezioni e tutti gli stack. -
Triage- Un piccolo dump contenente elenchi di moduli, elenchi di thread, informazioni sulle eccezioni, tutti gli stack e le informazioni personali rimosse.
Se non specificato,
Fullè l'impostazione predefinita.-
-o|--output <output_dump_path>Percorso completo e nome del file in cui deve essere scritto il dump raccolto. Verificare che l'utente per il quale è in esecuzione il processo dotnet disponga delle autorizzazioni di scrittura per la directory specificata.
Se non specificata:
- L'impostazione predefinita è .\dump_YYYYMMDD_HHMMSS.dmp in Windows.
- L'impostazione predefinita è ./core_YYYYMMDD_HHMMSS in Linux e macOS.
AAAAMMGG è Anno/Mese/Giorno e HHMMSS è Ore/Minuti/Secondi.
--diagAbilita la registrazione diagnostica della raccolta dump.
--crashreportAbilita la generazione di report di arresto anomalo del sistema.
Nota
In Linux e macOS questo comando prevede che l'applicazione di destinazione e dotnet-dump condividano la stessa variabile di ambiente TMPDIR. In caso contrario, il comando raggiungerà il timeout.
Nota
Per raccogliere un dump utilizzando dotnet-dump, è necessario che venga eseguito come stesso utente che esegue il processo target o come radice. In caso contrario, lo strumento non riuscirà a stabilire una connessione con il processo di destinazione.
Nota
La raccolta di un dump completo o dell'heap può causare la pagina del sistema operativo in memoria virtuale sostanziale per il processo di destinazione. Se il processo di destinazione è in esecuzione in un contenitore con un limite di memoria applicato, l'utilizzo della memoria maggiore potrebbe causare l'interruzione del contenitore da parte del sistema operativo se il limite è stato superato. È consigliabile eseguire test per assicurarsi che il limite di memoria sia sufficientemente elevato. Un'altra opzione consiste nel modificare temporaneamente o rimuovere il limite prima della raccolta di dump se l'ambiente supporta questa operazione.
analizza dotnet-dump
Avvia una shell interattiva per esplorare un dump. La shell accetta vari comandi SOS.
Riepilogo
dotnet-dump analyze <dump_path> [-h|--help] [-c|--command]
Argomenti
<dump_path>Specifica il percorso del file dump da analizzare.
Opzioni
-c|--command <debug_command>Esegue il comando all'avvio. È possibile usare più istanze di questo parametro in una chiamata per concatenare i comandi. I comandi verranno eseguiti nell'ordine in cui vengono forniti nella riga di comando. Se si vuole che dotnet dump venga chiuso dopo i comandi, l'ultimo comando deve essere "exit".
Analizzare i comandi SOS
| Comando | Funzione |
|---|---|
analyzeoom |
Visualizza le informazioni dell'ultimo OOM che si è verificato in una richiesta di allocazione all'heap GC. |
clrmodules |
Elenca i moduli gestiti nel processo. |
clrstack |
Fornisce l'analisi dello stack del solo codice gestito. |
clrthreads |
Elenca i thread gestiti in esecuzione. |
clru |
Visualizza un disassembly con le annotazioni di un metodo gestito. |
d oppure readmemory |
Esegue il dump del contenuto della memoria. |
dbgout |
Abilita/disabilita (-off) la registrazione SOS interna. |
dso |
Visualizza tutti gli oggetti gestiti trovati nell'ambito dei limiti dello stack corrente. |
dumpalc |
Contiene dettagli relativi a un assemblyLoadContext raccoglibile in cui viene caricato l'oggetto specificato. |
dumparray |
Contiene dettagli relativi a una matrice gestita. |
dumpasync |
Contiene informazioni sulle macchine a stati asincrone nell'heap di Garbage Collection. |
dumpassembly |
Contiene dettagli relativi a un assembly. |
dumpclass |
Visualizza informazioni sulla struttura EEClass in corrispondenza dell'indirizzo specificato. |
dumpconcurrentdictionary |
Illustra il contenuto del dizionario simultaneo. |
dumpconcurrentqueue |
Illustra il contenuto della coda simultaneo. |
dumpdelegate |
Contiene informazioni su un delegato. |
dumpdomain |
Contiene informazioni su tutti gli assembly all'interno di tutti gli AppDomain o su quello specificato. |
dumpgcdata |
Contiene informazioni sui dati GC. |
dumpgen |
Illustra il contenuto dell'heap per la generazione specificata. |
dumpheap |
Contiene informazioni sull'heap sottoposto a procedura di Garbage Collection e le statistiche di raccolta relative agli oggetti. |
dumpil |
Visualizza il linguaggio intermedio comune (CIL) associato a un metodo gestito. |
dumplog |
Scrive nel file specificato il contenuto di un log di stress in memoria. |
dumpmd |
Visualizza informazioni sulla struttura MethodDesc in corrispondenza dell'indirizzo specificato. |
dumpmodule |
Contiene informazioni su un modulo in corrispondenza dell'indirizzo specificato. |
dumpmt |
Contiene informazioni sulla tabella dei metodi in corrispondenza dell'indirizzo specificato. |
dumpobj |
Contiene informazioni sull'oggetto in corrispondenza dell'indirizzo specificato. |
dumpruntimetypes |
Trova tutti gli oggetti System.RuntimeType nell'heap GC e stampa inoltre il nome del tipo e la MethodTable a cui fanno riferimento. |
dumpsig |
Esegue il dump della firma di un metodo o di un campo specificato da <sigaddr> <moduleaddr>. |
dumpsigelem |
VisuEffettua il dump di un singolo elemento di un oggetto firma. |
dumpstackobjects |
Visualizza tutti gli oggetti gestiti trovati nell'ambito dei limiti dello stack corrente. |
dumpvc |
Contiene informazioni sui campi di una classe valore. |
eeheap |
Contiene informazioni sulla memoria del processo utilizzata dalle strutture dei dati di runtime interne. |
eestack |
Esegue dumpstack su tutti i thread del processo. |
eeversion |
Contiene informazioni sulle versioni di runtime e SOS. |
ehinfo |
Visualizza i blocchi di gestione delle eccezioni in un metodo JIT. |
exit oppure quit |
Esce dalla modalità interattiva. |
finalizequeue |
Visualizza tutti gli oggetti registrati per la finalizzazione. |
findappdomain |
Tenta di risolvere l'AppDomain di un oggetto GC. |
gchandles |
Visualizza le statistiche relative agli handle del Garbage Collector nel processo. |
gcheapstat |
Illustra le statistiche relative al Garbage Collector. |
gcinfo |
Illustra la codifica GC JIT per un metodo. |
gcroot |
Contiene informazioni sui riferimenti (o radici) all’oggetto in corrispondenza dell'indirizzo specificato. |
gcwhere |
Mostra la posizione nell'heap GC dell'indirizzo specificato. |
histclear |
Rilascia tutte le risorse utilizzate dalla famiglia di comandi Hist. |
histinit |
Inizializza le strutture SOS dal log di stress salvato nell'oggetto del debug. |
histobj |
Esamina tutti i record delle rilocazioni del log di stress e visualizza la catena di rilocazioni di Garbage Collection che hanno potuto condurre all'indirizzo passato come argomento. |
histobjfind |
Contiene tutte le voci del log che fanno riferimento all’oggetto in corrispondenza dell'indirizzo specificato. |
histroot |
Visualizza informazioni correlate sia alle promozioni sia alle rilocazioni della radice specificata. |
histstats |
Contiene le statistiche del log di stress. |
ip2md |
Visualizza la struttura MethodDesc in corrispondenza dell'indirizzo specificato nel codice con compilazione JIT. |
listnearobj |
Visualizza l'oggetto precedente e successivo all'indirizzo specificato. |
logopen |
Abilita la registrazione dei file della console. |
logclose |
Disabilita la registrazione dei file della console. |
logging |
Abilita/disabilita la registrazione SOS interna. |
lm oppure modules |
Visualizza i moduli nativi nel processo. |
name2ee |
Visualizza le strutture MethodTable e EEClass per il tipo o il metodo specificato nel modulo specificato. |
objsize |
Visualizza la dimensione dell'oggetto specificato. |
parallelstacks |
Visualizza lo stack di thread uniti in modo analogo al pannello Visual Studio "Stack paralleli". |
pathto |
Visualizza il percorso GC da <root> a <target>. |
pe oppure printexception |
Visualizza e formatta i campi di qualsiasi oggetto derivato dalla classe Exception in corrispondenza dell'indirizzo specificato. |
r oppure registers |
Visualizza i registri del thread. |
runtimes |
Elenca i runtime nella destinazione o modifica il runtime predefinito. |
setclrpath |
Imposta il percorso per caricare i file coreclr dac/dbi usando setclrpath <path>. |
setsymbolserver |
Abilita il supporto del server dei simboli. |
sos |
Esegue vari comandi di debug coreclr. Usare la sintassi sos <command-name> <args>. Per altre informazioni, vedere "soshelp". |
soshelp oppure help |
Visualizza tutti i comandi disponibili. |
soshelp <command> oppure help <command> |
Visualizza il comando specificato. |
syncblk |
Visualizza le informazioni sul supporto SyncBlock. |
taskstate |
Mostra uno stato attività in un formato leggibile. |
threadpool |
Contiene informazioni sul pool di thread di runtime. |
threadpoolqueue |
Illustra gli elementi di lavoro del pool di thread in coda. |
threadstate |
Stampa correttamente il significato di uno stato di thread. |
threads <threadid> oppure setthread <threadid> |
Imposta o visualizza l'ID thread corrente per i comandi SOS. |
timerinfo |
Visualizza informazioni sull'esecuzione dei timer. |
token2ee |
Illustra la struttura MethodTable e la struttura MethodDesc per il token e il modulo specificati. |
traverseheap |
Scrive informazioni sull'heap nel file specificato, in un formato leggibile dal profiler CLR. |
verifyheap |
Controlla l'heap GC per verificare la presenza di segni di danneggiamento. |
verifyobj |
Cerca segni di danneggiamento nell'oggetto passato come argomento. |
Nota
Altri dettagli sono disponibili in SOS Debugging Extension for .NET.
ps dotnet-dump
Elenca i processi dotnet da cui è possibile raccogliere i dump.
La versione 6.0.320703 di dotnet-dump e versioni successive visualizza anche gli argomenti della riga di comando con cui è stato avviato ogni processo, se disponibile.
Riepilogo
dotnet-dump ps [-h|--help]
Esempio
Si supponga di avviare un'app a esecuzione prolungata usando il comando dotnet run --configuration Release. In un'altra finestra si esegue il comando dotnet-dump ps. L'output visualizzato è il seguente. Gli argomenti della riga di comando, se presenti, vengono visualizzati nella versione 6.0.320703 di dotnet-dump e versioni successive.
> dotnet-dump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
Utilizzo di dotnet-dump
Il primo passaggio consiste nel raccogliere un dump. Questo passaggio può essere ignorato se è già stato generato un dump principale. Il sistema operativo o la funzionalità di generazione .NET Core del runtime dump possono creare dump di base.
$ dotnet-dump collect --process-id 1902
Writing minidump to file ./core_20190226_135837
Written 98983936 bytes (24166 pages) to core file
Complete
Analizzare ora il dump principale con il comando analyze:
$ 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.
>
Questa azione conduce a una sessione interattiva che accetta comandi come:
> 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]
Per visualizzare un'eccezione non gestita che ha terminato l'app:
> 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
Analizzare le perdite di memoria e le allocazioni
Le perdite di memoria si verificano quando l'app contiene riferimenti a oggetti non più necessari, impedendo al Garbage Collector di recuperare memoria. Usare dotnet-dump per identificare le perdite di memoria, trovare gli oggetti più grandi e comprendere dove viene utilizzata la memoria.
Per una procedura dettagliata completa del debug di una perdita di memoria, vedere Debug una perdita di memoria in .NET.
Identificare gli oggetti più grandi
Usare il dumpheap comando con l'opzione -stat per visualizzare un riepilogo degli oggetti nell'heap, ordinati in base alle dimensioni totali:
> 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
Questo output mostra quali tipi utilizzano la maggior parte della memoria. In questo esempio, System.String gli oggetti utilizzano circa 19 MB e Customer gli oggetti utilizzano circa 4,8 MB.
Identificare gli oggetti in base a spazio dei nomi o assembly
Per trovare i moduli o gli spazi dei nomi che utilizzano memoria, usare l'opzione -type con un nome di tipo parziale per filtrare i risultati:
> 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
Questo approccio consente di identificare le parti della codebase responsabili dell'utilizzo della memoria.
Trovare il numero più elevato di istanze
Per vedere quali tipi hanno la maggior parte delle istanze, indipendentemente dalle dimensioni totali, esaminare la colonna Conteggio nell'output dumpheap -stat . Gli oggetti con conteggi di istanze elevate possono indicare problemi di creazione o memorizzazione nella cache di oggetti inefficienti:
> dumpheap -stat
Statistics:
MT Count TotalSize Class Name
00007f6c1dc00f90 206770 19494060 System.String
00007f6c20a67498 200000 4800000 testwebapi.Controllers.Customer
00007f6c1dc021c8 1749 95696 System.SByte[]
Questo esempio mostra 206.770 String istanze e 200.000 Customer istanze.
Analizzare i riferimenti agli oggetti con gcroot
Dopo aver identificato oggetti di grandi dimensioni o numerosi, usare gcroot per scoprire perché un oggetto non viene sottoposto a Garbage Collection. Il gcroot comando mostra la catena di riferimenti dalle radici GC a un oggetto specifico:
> 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.
Questo output mostra che l'oggetto Customer è contenuto in un CustomerCache oggetto , che consente di identificare l'origine della perdita nel codice.
Analizzare la memoria in base alle dimensioni dell'oggetto
Usare le opzioni e -max per filtrare gli -min oggetti in base alle dimensioni:
> dumpheap -min 100000 -stat
Statistics:
MT Count TotalSize Class Name
00007f6c21625038 6 4063376 testwebapi.Controllers.Customer[]
00007f6c1dc014c0 12 416464 System.Byte[]
Total 18 objects
Questo comando mostra solo oggetti di dimensioni superiori a 100.000 byte, consentendo di concentrarsi sui consumer di memoria più grandi.
Trova deadlock
Usare dotnet-dump per diagnosticare situazioni di deadlock in cui i thread sono bloccati in attesa di risorse. Per una procedura dettagliata completa per il debug dei deadlock, vedere Debug un deadlock in .NET.
Elencare tutti i thread
Usare il threads comando per visualizzare tutti i thread gestiti:
> threads
*0 0x1DBFF (121855)
1 0x1DC01 (121857)
2 0x1DC02 (121858)
...
Esaminare gli stack di thread
Usare clrstack -all per visualizzare gli stack di chiamate di tutti i thread:
> clrstack -all
Cercare modelli in cui più thread sono bloccati in Monitor.Enter o primitive di sincronizzazione simili.
Trovare i proprietari dei blocchi
Usare il syncblk comando per vedere quali thread contengono blocchi e quali thread sono in attesa:
> 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 colonna MonitorHeld mostra il numero di thread in attesa del blocco. La colonna Owning Thread Info (Informazioni thread proprietario ) mostra il thread proprietario del blocco.
Scenari avanzati di analisi della memoria
Confrontare più dump
Per comprendere la crescita della memoria nel tempo, raccogliere più dump e confrontarli:
- Raccogliere un dump di base:
dotnet-dump collect -p <pid> -o baseline.dmp - Lasciare che l'app esegua e consumi più memoria.
- Raccogliere un secondo dump:
dotnet-dump collect -p <pid> -o after.dmp - Analizzare i dump e confrontare i
dumpheap -statrisultati.
Cercare i tipi con dimensioni totali molto maggiori o significativamente maggiori nel secondo dump.
Analizzare la memoria per tipi di oggetto specifici
Per eseguire il dump di tutte le istanze di un tipo specifico:
> dumpheap -type Customer
Address MT Size
00007f6ad09421f8 00007f6c20a67498 24
00007f6ad0942210 00007f6c20a67498 24
...
dumpobj Usare quindi per esaminare i singoli oggetti:
> 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
Raccogliere un dump in un contenitore Docker
dotnet-dump richiede ptrace funzionalità nel contenitore. Un modo comune per concederle consiste nell'avviare il contenitore con --cap-add=SYS_PTRACE. A seconda dell'ambiente, potrebbe anche essere necessario modificare il profilo seccomp del contenitore. Vedere dump: domande frequenti per la diagnosi dei problemi di configurazione della sicurezza dei contenitori.
Per installare dotnet-dump in un'immagine di produzione senza .NET SDK, usare i collegamenti di download direct dalla sezione Installa oppure usare una build Docker multi-stage Docker per copiare i file binari degli strumenti da un'immagine SDK. Per indicazioni complete sulla diagnostica dei contenitori, vedere Raccogliere la diagnostica nei contenitori Linux.
Risoluzione dei problemi relativi alla raccolta di dump
La raccolta di dump richiede che il processo sia in grado di chiamare ptrace. Se si verificano problemi durante la raccolta dei dump, l'ambiente in cui viene effettuata l’esecuzione può essere configurato per limitare tali chiamate. Vedere Dump: domande frequenti per ottenere suggerimenti per la risoluzione dei problemi e possibili soluzioni ai problemi comuni.