Verwenden des PageHeap-Hilfsprogramms zum Erkennen von Speicherfehlern in einem Visual C++-Projekt

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

  1. 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 new oder malloczu arbeiten.

    Starten Sie die PageHeap1.exe. Es erscheint ein Dialogfenster.

  2. 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 testet HeapAlloc. Das neue COM verwendet CoTaskMemAlloc nicht, sondern ruft stattdessen eine COM-Dynamic-Link-Bibliothek (DLL) auf, die einfach new aufruft. 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).

  3. 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

  1. Einschränkungen: PageHeap kann nur Speicherfehler aus der malloc-Familie (daher der C++-Operator new) und heapAlloc finden. Viele Anwendungen verwenden benutzerdefinierte Zuweisungen, und PageHeap kann diese Zuordnungen nicht abfangen.
  2. 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.
  3. 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.