Heapspeicherfehler

Heapspeicherfehler können auftreten, wenn Ihr Code unbeabsichtigt Steuerinformationen überschreibt, die von den Speicherverwaltungsfunktionen zur Steuerung der Heapspeicherverwendung verwendet werden. Die Anwendung, für die Sie das Debug ausführen, muss mit der Heaprüffunktion erstellt worden sein.

Jeder Block zugeordneten Speichers innerhalb eines Heapspeichers besteht aus einem Datenbereich, der bei der von der Zuordnungsfunktion zurückgegebenen Adresse beginnt, sowie aus einem Steuerbereich, der an den Datenbereich grenzt und von den Speicherverwaltungsfunktionen zum korrekten Freigeben des Speichers benötigt wird, wenn Sie die Speicherzuordnung aufheben. Wenn sie eine Steuerstruktur im Heapspeicher überschreiben (zum Beispiel indem Sie in Elemente schreiben, die sich außerhalb der zugeordneten Grenzen einer Feldgruppe befinden oder indem Sie eine Zeichenfolge in einen zu kleinen Block zugeordneten Speichers kopieren), werden die Steuerinformationen beschädigt, was zu einem falschen Verhalten des Programms führen kann, selbst wenn die Datenbereiche anderer zugeordneter Blöcke nicht überschrieben wurden.

Beachten Sie die folgenden Punkte, wenn Sie versuchen, Heapspeicherfehler zu lokalisieren:

Heapspeicherfehler außerhalb des Debuggers suchen

Um Heapspeicherfehler festzustellen, können Sie Ihr Programm so kompilieren, dass die Heapprüfungsversionen der Speicherverwaltungsfunktionen verwendet werden. (Informationen zur Compileroption -qheapdebug enthält der Abschnitt zur zugehörigen Debug-Compiler-Option.)Wenn Sie ein mit dieser Option kompiliertes Programm ausführen, führt jedes Aufrufen einer Speicherverwaltungsfunktion zu einer Heapprüfung für den Standardheapspeicher.Diese Heapprüfung umfasst eine Überprüfung der Steuerstrukturen jedes zugeordneten Speicherblocks im Heapspeicher, um sicherzustellen, dass nichts überschrieben wurde. Wenn ein Fehler festgestellt wird, wird das Programm beendet und es werden Informationen in Standardfehler geschrieben, einschließlich der Adresse, bei der die Heapspeicherbeschädigung aufgetreten ist, der Quellendatei und der Zeilennummer, bei denen der letzte gültige Heapspeicherstatus festgestellt wurde, sowie der Quellendatei und der Zeilennummer, bei denen der Speicherfehler festgestellt wurde.

Heapprüfung für Standard- und andere Heapspeicher

Die Heapprüfung ist nur für den Standardheapspeicher aktiviert, der von jeder ausführbaren Datei verwendet wird. Wenn die Debugversionen der Speicherverwaltungsfunktionen keine Heapspeicherbeschädigungen melden, Sie aber dennoch einen Fehler vermuten, verwenden Sie möglicherweise zusätzliche Heapspeicher, die beschädigt wurden.

Heapspeicherfehler innerhalb des Debuggers genau lokalisieren

Sie können die Ursache eines Heapspeicherfehlers aus dem Debugger heraus genau lokalisieren, falls Sie wissen, dass es sich bei dem Heapspeicher, der den Fehler verursacht, um den Standardheapspeicher handelt. Dazu müssen Sie kontinuierlich den Abstand zwischen der letzten Zeile, bei der der Heapspeicher noch in Ordnung war, und der ersten Zeile, bei der die Beschädigung auftrat, eingrenzen. Verwenden Sie eine Kombination aus Ausführungsbefehlen, Step-Befehlen, Zeilen- und Funktionsunterbrechungspunkten sowie die Einstellung Heapprüfung bei Stopp ausführen, um den Suchbereich einzugrenzen. Informationen zu dieser Einstellung finden Sie im zugehörigen Abschnitt.

Bei der Ausführung einer Heapprüfung bei Stopp werden möglicherweise weitere Codierfehler festgestellt

Bei semantisch nicht korrekten Programmen kann die Verwendung der Funktion Heapprüfung bei Stopp ausführen zu unterschiedlichen Ergebnissen führen, wenn ein Programm nicht korrekt auf Daten im Stack zugreift. Dies liegt daran, dass die Funktion Heapprüfung bei Stopp ausführen den Prozess und den Thread, für die ein Debug durchgeführt wird, veranlasst, bei jeder Unterbrechung der Ausführung eine Funktion zur Heapprüfung aufzurufen und dass diese Funktion zur Heapprüfung den sicheren Bereich des Stacks beeinflusst, indem sie einen Teil dieses Bereichs mit ihrem Stack-Frame überschreibt. Wenn zum Beispiel eine aufgerufene Funktion die Adresse einer lokalen Variablen zurückgibt, kann die aufrufende Funktion auf den Inhalt dieser lokalen Variablen zugreifen, der solange nicht geändert wird, wie der von der aufgerufenen Funktion verwendete Stack-Frame nicht von einem späteren Aufruf überschrieben wird. Wenn Sie jedoch aus der aufgerufenen Funktion heraus einen Befehl 'Step return' ausgeben, während Heapprüfung bei Stopp ausführen aktiv ist, wird die Funktion zur Heapprüfung sofort nach der Rückgabe von der aufgerufenen Funktion ausgeführt, und der Speicher, auf den der zurückgegebene Zeiger verweist, wurde möglicherweise vom Stack-Frame der Funktion zur Heapprüfung überschrieben.

Ausführung einer Heapprüfung bei Stopp beeinflusst Leistung

Die Heapprüfung innerhalb des Debuggers verursacht einen hohen Aufwand für Step-Befehle, weil der Heapspeicher nach jedem Schritt geprüft wird. Wenn sich dadurch, dass Sie größere Codeabschnitte schrittweise durchgehen oder häufig an Unterbrechungspunkten stoppen, die Debugleistung stark verringert, versuchen Sie, Heapprüfung bei Stopp ausführen nur für die Bereiche einzusetzen, die vermutlich Heapspeicherfehler verursachen.

Anmerkung:
  • Damit die Aktion Heapprüfung bei Stopp ausführen funktioniert, müssen Sie Ihre Anwendung so kompilieren, dass die Heapprüfungsversionen der Speicherverwaltungsfunktionen verwendet werden. Weitere Informationen dazu können Sie den Referenzunterlagen Ihres Compilers entnehmen.
  • Wenn Sie Heapprüfung bei Stopp ausführen aktivieren und Ihre Anwendung bis zum Ende ausführen und die Anwendung einen Heapspeicherfehler enthält, wird die Heapprüfung nicht durchgeführt. Wenn Sie den Heapspeicher direkt vor dem Ende prüfen möchten, definieren Sie einen Unterbrechungspunkt in der letzten Zeile Ihrer Anwendung.
  • Wenn Sie ein Debug für eine Multithread-Anwendung ausführen und ein Thread während der Ausführung im Compilerspeicherverwaltungscode, der ein Speichersemaphor sperrt, stoppt, wird die Heapprüfung nicht durchgeführt.

Feedback