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.

Ursprüngliche Produktversion: Visual C++
Ursprüngliche KB-Nummer: 264471

Zusammenfassung

Das Hilfsprogramm PageHeap kann für Anwendungen aktiviert werden, sodass alle malloc- newund heapAlloc -Zuordnungen automatisch auf Speicherfehler überwacht werden.

PageHeap1 ist ein Visual C++-Projekt mit verschiedenen Arten von Speicherfehlern. Um PageHeap für diese 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 das einzige Flag, 0x01 das Sie benötigen. Sie können weitere Informationen zur Verwendung erhalten, indem Sie PageHeap mit dem Fragezeichenflag (/?) über die Befehlszeile ausführen.

Funktionsweise von PageHeap

PageHeap gibt einen Zeiger auf zugeordneten Arbeitsspeicher an 8-Byte-Grenzen zurück. Auf das Ende des zurückgegebenen Zeigers folgen 0 bis 7 Schutzbytes (je nach angeforderter Größe werden 0 bis 7 Bytes addiert, um die Anforderungsgröße auf eine 8-Byte-Grenze aufzurunden), gefolgt von einer markierten PAGE_NOACCESS Speicherseite (weitere Informationen finden Sie unter VirtualAlloc). Zum 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 Speicherbelegungsgröße ein Vielfaches von acht ist, werden dem zurückgegebenen Zeiger keine Schutzbytes hinzugefügt.

Wenn das Ende der Zuordnung überschrieben wird, ändern sich die Wächterbytes, und PageHeap verursachen einen Zugriffsfehler, wenn der Arbeitsspeicher freigegeben wird. Wenn die Anwendung die Zuordnung (einschließlich der Wächterbytes) liest oder schreibt, tritt sofort ein Fehler aufgrund einer Zugriffsverletzung auf .

Verwenden des PageHeap1-Beispiels

  1. Erstellen Sie das pgh-Projekt, und führen Sie die pgh.exe aus.

    Hinweis

    Sie müssen einen Releasebuild ausführen, damit PageHeap mit new oder mallocfunktioniert.

    Starten Sie die PageHeap1.exe. Es gibt ein Dialogfeld-Popupfenster.

  2. Im Dialogfeld sehen Sie ein Textfeld, ein Kontrollkästchen Bad Alloc/Free und drei Schaltflächenpaare, new & delete, PageAlloc & Heap Free und COM new & COM Delete. Das Textfeld nimmt die Größe des Speichers an, den Sie zugeordnet haben möchten. Wenn das Kontrollkästchen Bad Alloc/Free aktiviert ist, belegt jeder Zuordnungstyp (neu, PageAlloc und COM neu) Arbeitsspeicher und schreibt dann über die Zuordnung hinaus. Wenn Ungültige Zuordnung nicht aktiviert ist, tritt keine Speicherüberschreibung auf.

    Schaltfläche neu testet den new Operator, Schaltfläche PageAlloc testet HeapAlloc. Das com new verwendet CoTaskMemAlloc nicht, sondern ruft stattdessen eine COM Dynamic Link Library (DLL) auf, die einfach aufruft new. 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 (IDE) von Visual C++ aus: Projekte>Einstellungen>C++>Kategorie: Codegenerierung>Laufzeitbibliothek verwenden).

  3. Wenn die Speicherbelegungsgröße 5 Bytes beträgt, wählen Sie nach dem Aktivieren des Kontrollkästchens Bad Alloc/Free auf der neuen Schaltfläche aus, 5 Bytes Arbeitsspeicher wird zugewiesen, und 0 wird in das sechste Byte geschrieben. Das Schreiben in das sechste Byte ist eine unzulässige Speicherüberschreibung, die jedoch bei einem Guard-Byte auftritt, sodass PageHeap diesen Fehler erst erkennt, wenn der Speicher gelöscht wurde. Wenn Sie die Schaltfläche "Löschen" auswählen, erkennt PageHeap das Überschreiben, und es wird ein Fehlermeldungsfeld ähnlich dem folgenden Beispiel angezeigt:

    Die Ausnahme Haltepunkt Ein Haltepunkt wurde erreicht. (0x80000003) in der Anwendung am Standort 0x77f9f9df aufgetreten.

    Wenn Sie Visual C++ als Just-In-Time-Debugger (JIT) angegeben haben, können Sie die Schaltfläche Abbrechen auswählen und im Code debuggen.

    Wenn Sie die Zuordnungsgröße in 8 (oder ein beliebiges Vielfaches von 8) ändern, führt die Auswahl der Schaltflächen new, pageAlloc oder COM New zu einem sofortigen Zugriffsverletzungsfehler , da Sie in eine Adresse ohne Zugriff geschrieben haben. (Das heißt, 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 C++-Operator new) und heapAllocfinden. 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-fähige Anwendungen können viel mehr Arbeitsspeicher verbrauchen als dieselbe Anwendung, ohne dass PageHeap aktiviert ist. Möglicherweise müssen Sie Ihre Auslagerungsdatei erhöhen, um den erhöhten Speicherbedarf zu erfüllen.

Sie können Pageheap1vcnet.exe hier herunterladen. Weitere Informationen zum Herunterladen von Microsoft-Supportdateien finden Sie unter Abrufen von Microsoft-Supportdateien von Onlinedienste.

Microsoft hat diese Datei auf Viren überprüft. Microsoft verwendete die aktuellste Virenerkennungssoftware, die zum Zeitpunkt der Veröffentlichung der Datei verfügbar war. Die Datei wird auf Servern mit verbesserter Sicherheit gespeichert, die nicht autorisierte Änderungen an der Datei verhindern.