[VISUAL C++] difference d execution entre mode debug et release

difference d execution entre mode debug et release [VISUAL C++] - C++ - Programmation

Marsh Posté le 24-09-2002 à 15:31:21    

Salut,
 
j'ai un gros probleme au niveau d un programme que j'ai fait...  
lorsque je l'execute en debug , il fonctionne parfaitement et
des que je le compile en release, j'ai des incoherence dans l execution.
je m'explique :  
par exemple j'insere des lignes dans une listview
en procedant de la maniere suivante :
 
SendMessage(listHwnd,LVM_INSERTITEM,0,(LPARAM)&lvItem) qui me renvoie
l index s il est inseree et -1  sinon
 
la structure lvitem est parfaitement initialisée pas de pb a ce niveau la.
 
En debug, l'insertion se fait parfaitement bien (dans mon cas 3 elements)
et les lignes apparaissent.
 
En release , rien ne se passe, les 3 fois le SendMessage me renvoie 0.
donc comme c est pas -1 pas d erreur mais l'insertion ne se passe pas
et donc les lignes n apparaissent pas.
 
C est absolument incomprehensible, j'ai tout verifié les structures  
sont bien initialisés, mais les messages ne partent pas (pas d erreur pourtant)
 
Evidemment en mode release on peut pas debugger puisque ... on est en release.
donc pseudo debuggage a coup de messagebox. J affiche toutes mes valeurs en
entree en debug et en release dans des messages box -> aucune difference.
 
J'ai lancé mon programme en debug et release et j'ai fait un coup  
de spy++ sur la list view -> en debug les LVM_INSERTITEM sont bien recu et en
release non.
 
Voila, dans mon programme il y a plein de bug comme ca (pas forcement au niveau des messages)
 
un autre vite fait : j'ai un char * dans lequel il y a une date
17/09/2002 par exemple
je fais un sscanf(mystr,"%d/%d/%d",&d,&m,&y) en debug il remplit
bien d = 17, m = 09 , y = 2002 et en release  
d = 00 , m = 09 , y = 2002
 
incroyable ...
 
Quelqu un connait il ce genre de pb ? car la je ne vois plus quoi faire
 
merci de vos reponses.
 
 

Reply

Marsh Posté le 24-09-2002 à 15:31:21   

Reply

Marsh Posté le 24-09-2002 à 15:35:09    

xilebo a écrit a écrit :

la structure lvitem est parfaitement initialisée pas de pb a ce niveau la.


j'en doute. la majorité des problèmes debug / release viennent d'une mauvaise alloc, qui peut être effectuée bien avant et faire planter la chose.

Reply

Marsh Posté le 24-09-2002 à 15:36:26    

En release il fait des optimisations
 
essaie de retirer l'optimisation globale, c'est généralement elle qui pose problème.
 
Dans les Settings du projet, onglet C/C++, category Optimizations

Reply

Marsh Posté le 24-09-2002 à 16:01:09    

Reply

Marsh Posté le 24-09-2002 à 16:34:03    

youdontcare a écrit a écrit :

j'en doute. la majorité des problèmes debug / release viennent d'une mauvaise alloc, qui peut être effectuée bien avant et faire planter la chose.




 
la structure lvitem est allouée de facon statique (c une variable
locale a ma fonction) ...
 
lorsque je mets une messagebox a un certain endroit dans le code
(en release ) la listview se remplit bien
 
C est vraiment etonnant. En tout cas je vais essayer ce que vous m'avez proposé... merci .

Reply

Marsh Posté le 24-09-2002 à 16:53:22    

Citation :

un autre vite fait : j'ai un char * dans lequel il y a une date 17/09/2002 par exemple

Euh... il est bien aloué comme il faut l'espace mémoire sur lequel pointe ton char * ?...

Reply

Marsh Posté le 24-09-2002 à 16:54:39    

ca sert a rien de se faire iech avec des printf ou messageBox, VC 6 a super tout beau debugger visuel, fo pas se gener pr ss servir ...

Reply

Marsh Posté le 24-09-2002 à 18:07:57    

Joel F a écrit a écrit :

ca sert a rien de se faire iech avec des printf ou messageBox, VC 6 a super tout beau debugger visuel, fo pas se gener pr ss servir ...




 
Pour les programmes compilée en mode debug oui.

Reply

Marsh Posté le 24-09-2002 à 18:56:47    

BB138 a écrit a écrit :

Citation :

un autre vite fait : j'ai un char * dans lequel il y a une date 17/09/2002 par exemple

Euh... il est bien aloué comme il faut l'espace mémoire sur lequel pointe ton char * ?...
 




 
etant donné que c est une donnée statique oui .  
 
 
A ce propos, j'ai enlevé l'optimisation de compilation et du coup ca marche ... mais est ce bien d avoir fait ca ?

Reply

Marsh Posté le 25-09-2002 à 11:50:26    

Tu as enlevé quoi ?
 
decoche simplement "Global Optimizations"

Reply

Marsh Posté le 25-09-2002 à 11:50:26   

Reply

Marsh Posté le 25-09-2002 à 14:12:24    

Je n'ai pas la solution, désolé mais je tiens tout de même à dire que sur un de mes projets, avec l'optimisation de vitesse en Release, le compilateur retirait purement et simplement une boucle 'for' du code ce qui empêchait le prog de fonctionner (j'ai vérifié avec des printf et des fprint).

Reply

Marsh Posté le 25-09-2002 à 14:23:57    

zop a écrit a écrit :

le compilateur retirait purement et simplement une boucle 'for' du code


ta boucle faisait référence à des données modifiées par une autre thread ?


Message édité par youdontcare le 25-09-2002 à 14:24:12
Reply

Marsh Posté le 25-09-2002 à 14:26:16    

zop a écrit a écrit :

Je n'ai pas la solution, désolé mais je tiens tout de même à dire que sur un de mes projets, avec l'optimisation de vitesse en Release, le compilateur retirait purement et simplement une boucle 'for' du code ce qui empêchait le prog de fonctionner (j'ai vérifié avec des printf et des fprint).




 
L'optimisation globale donne quelques fois des resultats surprenant, en particulier sur du calcul numrique !
 
resultat correct en debug  :sol:  
divergence en release  :kaola:

Reply

Marsh Posté le 25-09-2002 à 18:39:17    

youdontcare a écrit a écrit :

ta boucle faisait référence à des données modifiées par une autre thread ?




non, même pas la boucle for était le coeur de la fonction.

Reply

Marsh Posté le 26-09-2002 à 02:24:00    

zop a écrit a écrit :

le compilateur retirait purement et simplement une boucle 'for' du code


Simple curiosité, j'aimerais voir le code de ce for/fonction.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 26-09-2002 à 09:25:13    

marrant, pas encore eu de soucis irrecuperable...
 
Benb, y fait quoi exactement le compilo, quand il fait une optim globale ? (je lit souvent ca mais je sais pas c quoi derriere et cam'enerve :D)

Reply

Marsh Posté le 26-09-2002 à 09:55:11    

chrisbk a écrit a écrit :

marrant, pas encore eu de soucis irrecuperable...
 
Benb, y fait quoi exactement le compilo, quand il fait une optim globale ? (je lit souvent ca mais je sais pas c quoi derriere et cam'enerve :D)




J'ai pas plus d'infos que ca :
 

Citation :

/Og   (Global Optimizations)
Home |  Overview |  How Do I |  Compiler Options
 
Feature Only in Professional and Enterprise Editions   Code optimization is supported only in Visual C++ Professional and Enterprise Editions. For more information, see Visual C++ Editions.
 
This option provides local and global optimizations, automatic-register allocation, and loop optimization. (To find this option in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click Optimizations in the Category box. Under Optimizations, click Global Optimizations.)  
 
Local and global common subexpression elimination  
In this optimization, the value of a common subexpression is calculated once. In the following example, if the values of b and c do not change between the three expressions, the compiler can assign the calculation of b + c to a temporary variable, and substitute the variable for b + c:
 
a = b + c;
d = b + c;
e = b + c;
For local common subexpression optimization, the compiler examines short sections of code for common subexpressions. For global common subexpression optimization, the compiler searches entire functions for common subexpressions.
 
Automatic register allocation  
This optimization allows the compiler to store frequently used variables and subexpressions in registers; the register keyword is ignored.
 
Loop optimization  
This optimization removes invariant subexpressions from the body of a loop. An optimal loop contains only expressions whose values change through each execution of the loop. In the following example, the expression x + y does not change in the loop body:
 
i = -100;
while( i < 0 )
{
    i += x + y;
}
After optimization, x + y is calculated once rather than every time the loop is executed:
 
i = -100;
t = x + y;
while( i < 0 )
{
    i += t;
}
Loop optimization is much more effective when the compiler can assume no aliasing, which you set with Assume No Aliasing (/Oa) or Assume Aliasing Across Function Calls (/Ow).
 
Note   You can enable or disable global optimization on a function-by-function basis using the optimize pragma with the g option.
 
For related information, see Generate Intrinsic Functions (/Oi), Improve Float Consistency (/Op), and Full Optimization (/Ox).


 
Par experience, j'ai appris a desactiver cette option sur des progs de claculs numériques ou de nombreux algo divergeaient en release, et pas en debug.
 
Je suis meme allée plus loin, généralement le Pb venait d'une fonction (desaciver cette optim pour cette fonction resolvait le Pb) Généralement cette fonction était courte sans rien de particulier (pas de boucles ni meme d'autres appels de fonctions dedans : que des calculs...)
 
 
 

Reply

Marsh Posté le 26-09-2002 à 10:53:57    

okay, thks :jap:

Reply

Marsh Posté le 26-09-2002 à 17:43:41    

bon , j'ai trouvé a quoi c etait du (pour la date)...  
effectivement c etait une erreur de ma part ... merci quand meme  
pour les conseils car ca m a aidé pour d autres problemes.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed