Verwenden des Hilfsprogramms PageHeap zum Erkennen von Speicherfehlern in einem Visual C++-Projekt
In diesem Artikel wird beschrieben, wie Sie das Hilfsprogramm PageHeap verwenden, um Speicherfehler in Microsoft Visual C++ Projekten zu erkennen. Die Informationen in diesem Artikel gelten nur für nicht verwalteten Visual C++-Code.
Originalversion des Produkts: Visual C++
Ursprüngliche KB-Nummer: 264471
Zusammenfassung
Das PageHeap-Dienstprogramm kann für Anwendungen aktiviert werden, sodass alle mallocUnd-Zuordnungen new``heapAlloc automatisch auf Speicherfehler überwacht werden.
PageHeap1 ist ein Visual C++-Projekt mit mehreren Arten von Speicherfehlern. Um PageHeap in dieser Beispielanwendung zu aktivieren, geben Sie den folgenden Inhalt über die Befehlszeile ein:
pageheap /enable pgh.exe 0x01
Geben Sie dann den folgenden Inhalt ein:
pageheap
Hinweis
Der Anwendungsname, den PageHeap überwacht.
Für viele Anwendungen ist dies das einzige Kennzeichen, 0x01 das Sie benötigen. Weitere Informationen zur Verwendung erhalten Sie, indem Sie PageHeap mit dem Fragezeichen (/?) über die Befehlszeile ausführen.
Funktionsweise von PageHeap
PageHeap gibt einen Zeiger auf zugewiesenen Speicher an 8-Byte-Grenzen zurück. Auf das Ende des zurückgegebenen Zeigers folgen 0 bis 7 Guard-Bytes (je nach angeforderter Größe werden 0 Bytes bis 7 Bytes hinzugefügt, um die Anforderungsgröße auf eine 8-Byte-Grenze zu runden), gefolgt von einer markierten PAGE_NOACCESS Speicherseite (weitere Informationen finden Sie unter VirtualAlloc). Beispiel:
char * p;
p = new char[5];
PageHeap gibt einen Zeiger auf die 5 Bytes plus drei Schutzbytes zurück, um insgesamt 8 Bytes zu bilden, z. B. ..... XXX. Wenn die Größe der Speicherzuweisung ein Vielfaches von acht beträgt, werden dem zurückgegebenen Zeiger keine Schutzbytes hinzugefügt.
Wenn das Ende der Zuordnung überschrieben wird, ändern sich die Schutzbytes, und PageHeap verursacht einen Zugriffsverletzungsfehler , wenn der Speicher freigegeben wird. Wenn die Anwendung die Zuordnung (einschließlich der Schutzbytes) liest oder schreibt, tritt ein sofortiger Zugriffsverletzungsfehler auf.
Verwenden des PageHeap1-Beispiels
Erstellen Sie das pgh-Projekt, und führen Sie die pgh.exe aus.
Hinweis
Sie müssen einen Releasebuild für PageHeap ausführen, um mit
newodermalloc.Starten Sie die PageHeap1.exe. Es ist ein Dialogfeld-Popup vorhanden.
Im Dialogfeld sehen Sie ein TextBox-Steuerelement, ein Kontrollkästchen "Bad Alloc/Free" und drei Schaltflächenpaare, neue & Delete, PageAlloc & Heap Free und COM new & COM Delete.On the dialog box, you can see a TextBox, a Bad Alloc/Free check box, and three pair of buttons, new & delete, PageAlloc & Heap Free, and COM new & COM Delete. Das TextBox-Objekt nimmt die Größe des Arbeitsspeichers an, den Sie zugewiesen haben möchten. Wenn das Kontrollkästchen "Bad Alloc/Free" aktiviert ist, weist jeder Zuordnungstyp (neu, PageAlloc und COM neu) Speicher zu und schreibt dann über die Zuordnung hinaus. Wenn "Bad Alloc" nicht überprüft wird, erfolgt keine Speicherüberschreibung.
Schaltfläche neu testet den
newOperator, Schaltfläche PageAlloc testsHeapAlloc. Das neue COM verwendetCoTaskMemAllocnicht, sondern ruft eine DLL (DYNAMIC-Link Library) auf, die einfach aufruftnew. Um COM neu zu testen, müssen Sie entweder r1LeakMemMod.dll registrieren oder das Projekt "r1LeakMemMod" erstellen.Sie können eine Laufzeit-DLL-Bibliothek verwenden, damit PageHeap funktioniert. (Aus der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) von Visual C++, Projekte > Einstellungen > C++ > Kategorie: Codegenerierung > Laufzeitbibliothek verwenden).
Nachdem Sie das Kontrollkästchen "Bad Alloc/Free" aktiviert haben, wählen Sie auf der neuen Schaltfläche, wenn die Größe der Speicherzuweisung 5 Bytes beträgt, 5 Bytes Speicher zugewiesen und 0 in das sechste Byte geschrieben wird. Das Schreiben in das sechste Byte ist eine unzulässige Speicherüberschreibung, tritt jedoch bei einem Guard-Byte auf, sodass PageHeap diesen Fehler erst erkennt, wenn der Speicher gelöscht wird. Wenn Sie die Schaltfläche "Löschen" auswählen, erkennt PageHeap die Überschreibung, und es wird ein Meldungsfeld angezeigt, das dem folgenden Beispiel ähnelt:
Der Ausnahmehaltepunkt Ein Haltepunkt wurde erreicht. (0x80000003) in der Anwendung am Speicherort 0x77f9f9df aufgetreten.
Wenn Sie Visual C++ als JiT-Debugger (Just-In-Time) angegeben haben, können Sie die Schaltfläche "Abbrechen " auswählen und im Code debuggen.
Wenn Sie die Zuordnungsgröße auf 8 (oder ein Vielfaches von 8) ändern, führt die Auswahl neuer, pageAlloc- oder COM New-Schaltflächen zu einem sofortigen Zugriffsverstoßfehler , da Sie in eine Adresse ohne Zugriff geschrieben haben. (d. h., Sie müssen den Speicher nicht löschen, um den Fehler zu erkennen).
Hinweis
- Einschränkungen: PageHeap kann nur Speicherfehler aus der Familie (daher C
malloc++-Operatornew) undheapAlloc. Viele Anwendungen verwenden benutzerdefinierte Allokatoren, und PageHeap kann diese Zuordnungen nicht abfangen. - Wenn Sie mit dem Testen einer Anwendung fertig sind, führen Sie
pageheap /disable <appName>die Ausführung über die Befehlszeile aus, um PageHeap für diese Anwendung zu deaktivieren. - PageHeap-fähige Anwendungen können viel mehr Arbeitsspeicher verbrauchen als die gleiche Anwendung ohne PageHeap aktiviert. Möglicherweise müssen Sie Ihre Swapdatei erhöhen, um den erhöhten Speicherbedarf zu decken.
Sie können Pageheap1vcnet.exe hier herunterladen. Weitere Informationen zum Herunterladen von Microsoft-Supportdateien finden Sie unter So erhalten Sie Microsoft-Supportdateien von Onlinedienste.
Microsoft hat diese Datei auf Viren überprüft. Microsoft hat die aktuellste Software zur Virenerkennung verwendet, die zum Zeitpunkt der Veröffentlichung der Datei verfügbar war. Die Datei wird auf Servern mit erhöhter Sicherheit gespeichert, die dazu beitragen, nicht autorisierte Änderungen an der Datei zu verhindern.