Häufig auftretende Probleme beim Erstellen eines Releasebuilds
Während der Entwicklung verwenden Sie in der Regel einen Debugbuild des Projekts zum Erstellen und Testen. Wenn Sie Ihre Anwendung dann für einen Releasebuild erstellen, wird möglicherweise ein Zugriffsverstoß zurückgegeben.
In der nachstehenden Liste sind die Hauptunterschiede zwischen einem Debug- und einem Releasebuild (nicht für das Debugging) aufgeführt. Es gibt zwar weitere Unterschiede, die folgenden sind jedoch die wichtigsten, die dazu führen können, dass eine Anwendung in einem Releasebuild fehlschlägt, obwohl sie im Debugbuild funktioniert hat.
Weitere Informationen zum Abfangen von Releasebuildfehlern in Debugbuilds finden Sie unter /GZ (Aktivieren der Fehlerüberprüfung zur Laufzeit für den Stapelrahmen).
Heaplayout
Das Heaplayout ist die Ursache von ungefähr 90 % der auftretenden Probleme, wenn eine Anwendung im Debugbuild funktioniert, aber nicht im Releasebuild.
Wenn Sie Ihr Projekt für das Debuggen erstellen, verwenden Sie die Debugspeicherzuweisung. Dies bedeutet, dass der Speicher um alle Speicherbelegungen herum mit Schutzbytes belegt wird. Diese Schutzbytes erkennen eine Speicherüberschreibung. Da sich das Heaplayout zwischen der Release- und der Debugversion unterscheidet, verursacht eine Speicherüberschreibung möglicherweise keine Probleme in einem Debugbuild, hat dann jedoch schwerwiegende Auswirkungen in einem Releasebuild.
Weitere Informationen finden Sie unter Überprüfen auf Speicherüberschreibungen und Verwenden des Debugbuilds für die Überprüfung auf Speicherüberschreibungen.
Kompilierung
Viele der MFC-Makros und der Großteil der MFC-Implementierung ändern sich, wenn Sie einen Releasebuild erstellen. Das ASSERT-Makro wird in einem Releasebuild beispielsweise zu nichts ausgewertet. Es wird also kein Code ausgeführt, der in einem ASSERT-Makro enthalten ist. Weitere Informationen finden Sie unter Verwenden von VERIFY anstelle von ASSERT.
Einige Funktionen sind Inlinefunktionen, um die Erstellung des Releasebuilds zu beschleunigen. Optimierungen sind in Releasebuilds im Allgemeinen aktiviert. Es wird außerdem eine andere Speicherzuweisung verwendet.
Zeigerunterstützung
Durch den Mangel an Debugginginformationen wird die Auffüllung Ihrer Anwendung entfernt. In einem Releasebuild ist die Wahrscheinlichkeit bei hängenden Zeigern höher, dass diese auf nicht initialisierten Speicher anstatt auf Debuginformationen zeigen.
Optimierungen
Je nach der Beschaffenheit bestimmter Codesegmente kann der Optimierungscompiler unerwarteten Code generieren. Diese Ursache ist diejenige mit der geringsten Wahrscheinlichkeit, kommt jedoch gelegentlich vor. Weitere Informationen zur Lösung finden Sie unter Optimieren Ihres Codes.