Objektdumps
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Nur "Systemeigen" |
||||
Pro, Premium und Ultimate |
Nur "Systemeigen" |
In einem MFC-Programm kann CMemoryState::DumpAllObjectsSince verwendet werden, um eine Beschreibung aller Objekte auf dem Heap zu sichern, die nicht freigegeben wurden. DumpAllObjectsSince sichert alle seit dem letzten CMemoryState::Checkpoint reservierten Objekte. Wurde kein Checkpoint-Aufruf durchgeführt, gibt DumpAllObjectsSince alle momentan im Arbeitsspeicher enthaltenen Objekte sowie Elemente, die kein Objekt darstellen, aus.
Tipp
Bevor MFC-Objektdumps erstellt werden können, muss die Gewusst wie: Aktivieren der Speicherdiagnose aktiviert werden.
Tipp
In MFC wird von allen Objekten, die Speicherverluste verursachen, beim Beenden des Programms automatisch ein Dump erstellt. Daher ist kein Code zum Erstellen von Objektdumps am Programmende erforderlich.
Durch den folgenden Code werden alle Objekte auf Speicherverluste getestet, indem die beiden Speicherzustände verglichen und bei Auftreten von Verlusten alle Objekte gesichert werden.
Legacycodebeispiel
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
Im Folgenden der Inhalt des Dumps:
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
Stabile Programmierung
Die in geschweiften Klammern gesetzten Zahlen am Zeilenanfang geben die Reihenfolge an, in der die Objekte reserviert wurden. Das zuletzt reservierte Objekt verfügt über die höchste Nummer und befindet sich im Dump an erster Stelle. Eine ausführlichere Analyse dieses Beispiels finden Sie unter Interpretation von Objektdumps.
Die maximal verfügbaren Informationen aus einem Objektdump erhalten Sie, indem Sie die Memberfunktion Dump für jedes von CObject abgeleitete Objekt überschreiben, um Anpassung von Objektdumps festzulegen.
Sie können einen Haltepunkt für eine bestimmte Speicherbelegung festlegen, indem Sie für die globale _afxBreakAlloc-Variable den in geschweiften Klammern angegebenen Wert festlegen. Wenn das Programm erneut ausgeführt wird, unterbricht der Debugger die Ausführung, sobald diese Reservierung erfolgt. Sie können dann die Aufrufliste durchsehen, um festzustellen, wie das Programm zu diesem Punkt gelangt ist.
Die C-Laufzeitbibliothek verfügt über eine vergleichbare Funktion, _CrtSetBreakAlloc, die Sie für C-Laufzeitreservierungen verwenden können.