release rechnet anders als debug
-
Hallo zusammen,
ich habe folgendes Problem. Ich nutze die libsrtp von cisco zum verschlüsseln und authentifizieren von RTP Packeten.
Im Debug Mode ist es so, eingehende Packete werden entschlüsselt. Dazu wird ein Vergleichstag errechnet und mit dem Authentifizierungstag verglichen. Funktioniert so wunderbar. Im Release allerdings kommt für dieses Vergleichstag ein ganz anderes Ergebnis heraus.
Ich habe schon diverses probiert. z.B. Critical Sections an den nötigen Stellen um evtl. Timing Problemen zuvor zu kommen. Anpassen des Struct Member Alignments. Selbst das abschalten der Optimierung hat nichts geholfen, auch dort läuft es falsch.Woran könnte es denn noch liegen, das im Release ein anderes Ergebnis herauskommt als im Debug?
Gruß
CrazyPlayaEDIT: Achso ich arbeite mit VS2010 Pro mit SP1
-
CrazyPlaya schrieb:
Woran könnte es denn noch liegen, das im Release ein anderes Ergebnis herauskommt als im Debug?
Hauptverdacht: Uninitialisiere Variablen.
-
Also in der aufgerufenen Funktion aus der lib sind alle benötigten Variablen initialisiert soweit ich das nachverfolgen konnte. Und alle an die Funktion übergebenen Werte sind auch initialisiert.
-
asc schrieb:
CrazyPlaya schrieb:
Woran könnte es denn noch liegen, das im Release ein anderes Ergebnis herauskommt als im Debug?
Hauptverdacht: Uninitialisiere Variablen.
Welche Variablen werden denn in der Release anders initialisiert? Das ist doch meist unabhängig vom Build... Sicher gibt's da Sachen, die über Compilerdirektiven davon anhängig gemacht werden aber generell denke ich scheint das Problem ein anderes zu sein. Sind noch weitere Bibliotheken eingebunden? Sowas unterscheidet sich schon mal zwischen Debug und Release....
-
Es sind zwar noch andere Bibliotheken eingebunden aber eigentlich keine die mit der libsrtp zusammen genutzt werden.
-
CrazyPlaya schrieb:
Es sind zwar noch andere Bibliotheken eingebunden aber eigentlich keine die mit der libsrtp zusammen genutzt werden.
Hast du mal die Einstellungen verglichen? Gibts grundlegende Unterschiede zwischen Debug und Release?
Ansonsten wird dir nichts anderes übrig bleiben als zu versuchen, in der Release zu Debuggen um die Vregleiche herzustellen.
-
Hab bereits sämtliche Einstellungen verglichen und wie gesagt im Release sogar den Optimierer ausgeschaltet.
Ich befürchte da werde ich vermutlich nicht drum herumkommen:s
-
AndyDD schrieb:
asc schrieb:
Hauptverdacht: Uninitialisiere Variablen.
Welche Variablen werden denn in der Release anders initialisiert?
Ich kenne es zumindest von einigen Compilern, das uninitialisierte Variablen im Debugmodus ungeachtet davon ob sie nach dem C++ Standard eine Standartinitialisierung haben oder nicht, mit 0 initialisiert werden, im Release aber nicht (In der Vergangenheit schon den ein oder anderen schlecht nachvollziehbaren Fehler wegen uninitialisierten Zeigern in einem Projekt erlebt).
AndyDD schrieb:
Das ist doch meist unabhängig vom Build...
Nein, kann sich im Debug anders verhalten als im Release.
-
Afaik passiert die Initialisierung mit 0xCD um eben nicht wie eine korrekte 0 auszusehen (MSVC)
MfG SideWinder
-
asc schrieb:
Ich kenne es zumindest von einigen Compilern, das uninitialisierte Variablen im Debugmodus ungeachtet davon ob sie nach dem C++ Standard eine Standartinitialisierung haben oder nicht, mit 0 initialisiert werden, im Release aber nicht (In der Vergangenheit schon den ein oder anderen schlecht nachvollziehbaren Fehler wegen uninitialisierten Zeigern in einem Projekt erlebt).
MSVC macht es schlauer: uninitialisiertes Zeugs wird mit 0xcc angefüllt.
Dadurch gibt's aber natürlich auch einen Unterschied zwischen Debug und Release.
@CrazyPlaya:
Lass einfach mal alle Ausgangswerte und Zwischenergebnisse der Berechnung über TRACE() o.ä. ausgeben.
-
SideWinder schrieb:
Afaik passiert die Initialisierung mit 0xCD um eben nicht wie eine korrekte 0 auszusehen (MSVC)
MfG SideWinder
Richtig. Ein super Feature übrigens. Im Release sind diese Variablen meistens 0 (für frischen Speicher) und im Debug halt 0xCD. Normalerweise fällt dies deswegen bei Berechnungen sofort. Eine böse Falle bieten aber boolsche Variablen:
Hat man im Code
if (bIAmNotInitialized) DoSomething();
wirds im Debug ausgeführt, im Release aber nicht, da ja jeder Bool der != 0 ist implizit als true ausgewertet wird.