Unterschied zwischen Debug und Release



  • Moin Moin,

    ich hätte mal eine Frage, und zwar wo genau liegen die Unterschiede zwischen der Debug Version und Release Version eines Programmes.

    Diese Frage hab ich mir gestellt als ich folgendes beobachtet hab:

    Mein Programm, welches ich mit MSVC++6 erstellt habe, stürzte mit einem Pointer Error ab, aber wenn ich das Programm im Debug Modus gestartet hab, hat mein Programm alles korrekt abgearbeitet und meldete keinen Speicherfehler mehr.

    Ich dachte mir also, wenn ich das ganze mit einem GCC Compiler durchlaufen lasse, dass der mir vielleicht ein paar Fehlermeldungen mehr rausspuckt.
    So habe ich mir die Version 4.9.9.2 von Dev-C++ besorgt und das da mal durchlaufen lassen.

    Auch hier "0 Fehler, 0 Warnungen". (mit -Wall Parameter)
    Da lief das Programm sogar noch instabiler als erwartet.

    Nach dem Start eines Threads krachte es mit diesem Compiler. Und auch hier war das Verhalten im Debug Modus wieder ein anderes. Da stürzte das Programm sogar schon fast beim Start ab.

    Deshalb meine Frage:

    Sollte ein Debugger nicht genau den gleichen Zustand herstellen können, wie ein normaler Durchlauf?
    Welche Unterschiede sind im Debug Modus im Vergleich zum Release Modus?

    Für mich hört sich das alles sehr abenteuerlich an.
    Sicherlich gibt es auch verbesserungswürdige Stellen in meinem Quelltext, aber das ist ein anderes Thema.

    MfG

    Vic



  • Hmm, ich hatte die Unterschiede schonmal im Detail aufgelistet, finde den Thread aber nicht mehr.

    Der Punkt, der aber für dich entscheidend sein sollte ist der, dass bei der Debugversion der Laufzeitbibliothek die allokierten Speicherbereiche mit Sentinelwerten umgeben werden. Das ist zusätzlicher Speicher, der die Aufgabe hat, deinen Speicher zu umgeben, damit bei Buffer Overflows nur dieser Schutzspeicher überschrieben wird aber nicht die Variablen, die direkt dahinter folgen und somit in der Releasekonfiguration, in der dieser Schutzmechanismus nicht existiert überschrieben werden würden.

    Beim Verlassen der Funktion oder beim Löschen eines Blocks auf dem Heap kann dadurch dann erkannt werden, ob du Speicher überschrieben hast, auf den du nicht zugreifen solltest(Vorausgesetzt diese Überprüfungen sind in den Projektoptionen aktiviert).
    Es wird also höchstwahrscheinlich auf einen Programmierfehler deinerseits zurückzuführen sein, der sich durch unterschiedliches (undefiniertes) Verhalten in Debug- und Releasekonfiguration bemerkbar macht.



  • Es wird also höchstwahrscheinlich auf einen Programmierfehler deinerseits zurückzuführen sein

    Das hab ich mir schon fast gedacht 😛
    Aber das mit dem zusätzlichen Speicher ist gut zu wissen, dafür ein riesen thx.
    Jetzt weiss ich wenigstens wo ich ungefähr suchen muss.
    Falls du noch den Link zu deinem altem Beitrag finden solltest, so poste den bitte. Die weiteren Unterschiede interessieren mich.

    MfG

    Vic



  • Doch nicht ganz so im Detail aber hier ist der Link:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-117349-and-highlight-is-.html



  • Ich habe meinen Fehler mittlerweile gefunden.

    Das Problem war wirklich dass ich über alloziierte Speichergrenzen hinausgeschrieben hab. Jedoch war das Programm so meiner Ansicht nach logisch korrekt.

    Eine Schleife in der Speicher freigegeben und dann gleich darauf wieder neu alloziiert wurde, hat bei mir den Fehler verursacht.

    Hat ja auch die ersten Male immer funktioniert, aber nicht immer 😃

    MfG

    Vic


Anmelden zum Antworten