Freigeben über


Verwenden des Debugbuilds zur Suche nach Speicherüberschreibungen

Zum Verwenden des Debugbuilds zur Überprüfung auf Speicherüberschreibungen müssen Sie Ihr Projekt zunächst zum Debuggen neu erstellen. Wechseln Sie dann zum Anfang der InitInstance-Funktion Ihrer Anwendung, und fügen Sie die folgende Zeile hinzu:

afxMemDF |= checkAlwaysMemDF;

Mit der Debug-Speicherbelegungsfunktion werden Wächterbytes um alle Speicherbelegungen gelegt. Diese Wächterbytes helfen jedoch nur, wenn Sie sie auf Veränderungen überprüfen (die auf eine Speicherüberschreibung hindeuten). Andernfalls wird dadurch nur ein Puffer bereitgestellt, der es Ihnen tatsächlich ermöglicht, mit einer Speicherüberschreibung davonzukommen.

Durch Aktivieren von checkAlwaysMemDF zwingen Sie MFC dazu, bei jedem Aufruf von new oder delete die AfxCheckMemory-Funktion aufzurufen. Wenn eine Speicherüberschreibung erkannt wurde, wird eine TRACE-Meldung generiert, die in etwa wie folgt aussieht:

Damage Occurred! Block=0x5533

Wenn eine dieser Meldungen angezeigt wird, müssen Sie den Code schrittweise durchlaufen, um zu bestimmen, an welcher Stelle der Schaden aufgetreten ist. Sie können selbst explizite Aufrufe von AfxCheckMemory durchführen, um die Stelle der Speicherüberschreibung genauer einzugrenzen. Beispiel:

ASSERT(AfxCheckMemory());
    DoABunchOfStuff();
    ASSERT(AfxCheckMemory());

Wenn die erste ASSERT-Anweisung erfolgreich ist und die zweite nicht, bedeutet dies, dass die Speicherüberschreibung in der Funktion zwischen den beiden Aufrufen aufgetreten sein muss.

Abhängig von der Art Ihrer Anwendung stellen Sie möglicherweise fest, dass afxMemDF dazu führt, dass Ihr Programm so langsam ausgeführt wird, dass Sie es nicht einmal testen können. Die afxMemDF-Variable bewirkt, dass AfxCheckMemory für jeden Aufruf von „new“ und „delete“ aufgerufen wird. In diesem Fall sollten Sie Ihre eigenen Aufrufe von AfxCheckMemory( ) wie oben gezeigt durchführen und versuchen, die Speicherüberschreibung auf diese Weise einzugrenzen.

Siehe auch

Beheben von Problemen mit dem Releasebuild