Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel wird beschrieben, wie Sie das PageHeap-Hilfsprogramm verwenden, um Speicherfehler in Microsoft Visual C++-Projekten zu erkennen. Die Informationen in diesem Artikel gelten nur für nicht verwalteten Visual C++-Code.
Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 264471
Zusammenfassung
Das PageHeap-Hilfsprogramm kann für Anwendungen aktiviert werden, sodass alle malloc, new und heapAlloc Zuweisungen automatisch auf Speicherfehler überwacht werden.
PageHeap1 ist ein Visual C++-Projekt mit mehreren Speicherfehlertypen. Um PageHeap für diese Beispielanwendung zu aktivieren, geben Sie in der Befehlszeile den folgenden Inhalt 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 0x01 die einzige Flagge, die Sie benötigen. Weitere Informationen zur Verwendung erhalten Sie, indem Sie PageHeap mit dem Fragezeichen-Flag (/?) über die Befehlszeile ausführen.
Funktionsweise von PageHeap
PageHeap gibt einen Zeiger zurück, um Speicher an 8-Byte-Begrenzungen zuzuweisen. Auf das Ende des zurückgegebenen Zeigers folgen 0 bis 7 Guard Bytes (je nach angeforderter Größe werden 0 Bytes bis 7 Byte hinzugefügt, um die Anforderungsgröße auf eine Grenze von 8 Byte aufzurunden), gefolgt von einer speicherseitigen Markierung PAGE_NOACCESS (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 Speicherzuordnung ein Vielfaches von acht ist, werden dem zurückgegebenen Zeiger keine Schutzbytes hinzugefügt.
Wenn das Ende der Zuordnung überschrieben wird, ändern sich die Guard-Bytes, und PageHeap verursacht einen Zugriffsverletzungsfehler, wenn der Speicher freigegeben wird. Wenn die Anwendung die Zuordnung (einschließlich der Guardbytes) überliest oder überschreibt, tritt ein sofortiger Zugriffsverletzungsfehler auf .
Verwenden des PageHeap1-Beispiels
Erstellen Sie das PGH-Projekt, und führen Sie die pgh.exeaus.
Hinweis
Sie müssen einen Releasebuild für PageHeap ausführen, um mit
newodermalloczu arbeiten.Starten Sie die PageHeap1.exe. Es erscheint ein Dialogfenster.
Im Dialogfeld sehen Sie ein Textfeld, ein Kontrollkästchen Bad Alloc/Free und drei Schaltflächenpaare: Neu und Löschen, PageAlloc und Heap Free, COM new und COM Delete. Das TextBox-Steuerelement nimmt die Größe des Arbeitsspeichers ein, den Sie zugewiesen haben möchten. Wenn das Kontrollkästchen "Bad Alloc/Free" aktiviert ist, weist jeder Zuordnungstyp (neu, PageAlloc und COM neu) Arbeitsspeicher zu und schreibt dann über den zugewiesenen Speicher hinaus. Wenn "Speicherfehlzuordnung" nicht überprüft wird, tritt keine Speicherüberschreibung auf.
Schaltfläche Neu testet den
new-Operator, Schaltfläche PageAlloc testetHeapAlloc. Das neue COM verwendetCoTaskMemAllocnicht, sondern ruft stattdessen eine COM-Dynamic-Link-Bibliothek (DLL) auf, die einfachnewaufruft. 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 (Visual C++ Integrated Development Environment, IDE), Projekten>Einstellungen>C++>Kategorie: Codegenerierung>Laufzeitbibliothek verwenden).
Nachdem Sie das Kontrollkästchen "Bad Alloc/Free" aktiviert haben und wenn die Speicherzuweisungsgröße 5 Byte beträgt, klicken Sie auf die neue Schaltfläche. Es werden 5 Byte Speicher zugewiesen, und 0 wird in das sechste Byte geschrieben. Das Schreiben in das sechste Byte ist ein unzulässiger Speicherüberschreibvorgang, tritt jedoch auf einem Schutzbyte auf, sodass PageHeap diesen Fehler erst erkennt, wenn der Speicher gelöscht wird. Wenn Sie die Schaltfläche "Löschen" auswählen, erkennt PageHeap das Überschreiben, und es wird ein Fehlermeldungsfeld wie im folgenden Beispiel angezeigt:
Die Ausnahme "Haltepunkt" ist aufgetreten. Ein Haltepunkt wurde erreicht. (0x80000003) ist am Standort 0x77f9f9df in der Anwendung aufgetreten.
Wenn Sie Visual C++ als Just-In-Time (JIT)-Debugger angegeben haben, können Sie die Schaltfläche "Abbrechen " auswählen und in den Code debuggen.
Wenn Sie die Zuordnungsgröße auf 8 (oder ein Vielfaches von 8) ändern, führt die Auswahl von new, pageAlloc oder COM New zu einem sofortigen Zugriffsverletzungsfehler, da Sie auf eine Adresse ohne Zugriffsberechtigung 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
malloc-Familie (daher der C++-Operatornew) undheapAllocfinden. Viele Anwendungen verwenden benutzerdefinierte Zuweisungen, und PageHeap kann diese Zuordnungen nicht abfangen. - Wenn Sie das Testen einer Anwendung abgeschlossen haben, führen Sie
pageheap /disable <appName>über die Befehlszeile aus, um PageHeap für diese Anwendung zu deaktivieren. - PageHeap-aktivierte Anwendungen können viel mehr Arbeitsspeicher verbrauchen als die gleiche Anwendung, ohne PageHeap aktiviert zu haben. Möglicherweise müssen Sie die Auslagerungsdatei erhöhen, um den erhöhten Speicherbedarf zu erfüllen.
Hier können Sie Pageheap1vcnet.exe herunterladen. Weitere Informationen zum Herunterladen von Microsoft-Supportdateien finden Sie unter Abrufen von Microsoft-Supportdateien von Onlinediensten.
Microsoft hat diese Datei auf Viren gescannt. Microsoft hat die aktuellste Virenerkennungssoftware verwendet, die am Datum der Veröffentlichung der Datei verfügbar war. Die Datei wird auf Sicherheitsservern gespeichert, die verhindern, dass nicht autorisierte Änderungen an der Datei vorgenommen werden.