Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2213 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°219483
xilebo
noone
Posté le 24-09-2002 à 15:31:21  profilanswer
 

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.
 
 

mood
Publicité
Posté le 24-09-2002 à 15:31:21  profilanswer
 

n°219490
youdontcar​e
Posté le 24-09-2002 à 15:35:09  profilanswer
 

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.

n°219492
BENB
100% Lux.
Posté le 24-09-2002 à 15:36:26  profilanswer
 

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

n°219522
MiniCooler
Posté le 24-09-2002 à 16:01:09  profilanswer
 
n°219552
xilebo
noone
Posté le 24-09-2002 à 16:34:03  profilanswer
 

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 .

n°219569
bb138
La vie est belle ...
Posté le 24-09-2002 à 16:53:22  profilanswer
 

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 * ?...

n°219571
Joel F
Real men use unique_ptr
Posté le 24-09-2002 à 16:54:39  profilanswer
 

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 ...

n°219622
BENB
100% Lux.
Posté le 24-09-2002 à 18:07:57  profilanswer
 

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.

n°219651
xilebo
noone
Posté le 24-09-2002 à 18:56:47  profilanswer
 

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 ?

n°219848
BENB
100% Lux.
Posté le 25-09-2002 à 11:50:26  profilanswer
 

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

mood
Publicité
Posté le 25-09-2002 à 11:50:26  profilanswer
 

n°219934
zop
1 world, 1 web, 1 Windows
Posté le 25-09-2002 à 14:12:24  profilanswer
 

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).

n°219947
youdontcar​e
Posté le 25-09-2002 à 14:23:57  profilanswer
 

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
n°219953
BENB
100% Lux.
Posté le 25-09-2002 à 14:26:16  profilanswer
 

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:

n°220171
zop
1 world, 1 web, 1 Windows
Posté le 25-09-2002 à 18:39:17  profilanswer
 

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.

n°220326
Musaran
Cerveaulté
Posté le 26-09-2002 à 02:24:00  profilanswer
 

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
n°220374
chrisbk
-
Posté le 26-09-2002 à 09:25:13  profilanswer
 

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)

n°220392
BENB
100% Lux.
Posté le 26-09-2002 à 09:55:11  profilanswer
 

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...)
 
 
 

n°220423
chrisbk
-
Posté le 26-09-2002 à 10:53:57  profilanswer
 

okay, thks :jap:

n°220891
xilebo
noone
Posté le 26-09-2002 à 17:43:41  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
MySQL : activer le mode "debug" sous Linux ?[ACCESS] Propriétés d'une instance d'un contrôle en mode continu
PHP - Execution automatique d'un scriptvisual studio 6.0 entreprise edition
Pb d'éxécution de dll en runtimeDifférence entre CDC et HDC
Visual Basic & adresse IPVisual c++ ou pas Visual c++ ?
comment changer un nom au demarage d'un programme fé en c++ visual bas 
Plus de sujets relatifs à : [VISUAL C++] difference d execution entre mode debug et release


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR