Dump di oggetti
Le informazioni contenute in questo argomento sono valide per:
Edizione |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Solo nativo |
||||
Pro, Premium e Ultimate |
Solo nativo |
In un programma MFC è possibile utilizzare CMemoryState::DumpAllObjectsSince per eseguire il dump della descrizione di tutti gli oggetti dell'heap non deallocati. DumpAllObjectsSince esegue il dump di tutti gli oggetti allocati dall'ultima CMemoryState::Checkpoint. Se non ha avuto luogo alcuna chiamata Checkpoint, DumpAllObjectsSince effettuerà il dump di tutti gli oggetti e non oggetti attualmente in memoria.
Nota
Prima di poter utilizzare il dump degli oggetti MFC, è necessario completare la Procedura: attivare la diagnostica della memoria.
Nota
MFC effettua automaticamente il dump di tutti gli oggetti persi alla chiusura del programma, pertanto non è necessario creare codice per il dump degli oggetti in tale posizione.
Nel codice che segue si verifica la presenza di eventuali perdite di memoria confrontando due stati della memoria e si effettua il dump di tutti gli oggetti eventualmente persi.
Codice di esempio legacy
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
Il contenuto del dump sarà del seguente tipo:
Dumping objects ->
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
Programmazione robusta
I numeri tra parentesi graffe all'inizio della maggior parte delle righe specificano l'ordine in cui gli oggetti sono stati allocati. L'ultimo oggetto allocato presenta il numero più alto e si trova all'inizio del dump. Per un'analisi più dettagliata di questo esempio, vedere Interpretazione di dump di oggetti.
Per ottenere la massima quantità di informazioni da un dump di oggetti, è possibile eseguire l'override della funzione membro Dump di qualsiasi oggetto derivato da CObject per la Personalizzazione di dump di oggetti.
È possibile definire un punto di interruzione su una particolare allocazione di memoria impostando la variabile globale _afxBreakAlloc sul numero indicato tra le parentesi graffe. Se si esegue nuovamente il programma il debugger interromperà l'esecuzione quando avrà luogo tale allocazione. Sarà quindi possibile esaminare lo stack di chiamate per sapere come il programma è giunto a tale punto.
La libreria di runtime del linguaggio C dispone di una funzione simile, _CrtSetBreakAlloc, che è possibile utilizzare per le allocazioni di runtime del linguaggio C.