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

  FORUM HardWare.fr
  Programmation
  C++

  VC++ : Release VS Debug ?

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

VC++ : Release VS Debug ?

n°750809
payen
Posté le 03-06-2004 à 14:54:15  profilanswer
 

Bonjour a tous,
 
Je voulais juste connaitre la difference entre les programmes scompiles en mode Debug et en mode Release. Ce que j'ai pu voir : la taille du .exe et la rapidite d'execution (+ rapide en Debug, mais bcp + gros) ...
 
 
Il doit bien y avoir autre chose !
 
Merci d'avance

mood
Publicité
Posté le 03-06-2004 à 14:54:15  profilanswer
 

n°750813
skeye
Posté le 03-06-2004 à 14:55:38  profilanswer
 

Debug c'est pour faire du debug, et release c'est pour faire une release.[:skeye]

n°750826
skeye
Posté le 03-06-2004 à 14:59:38  profilanswer
 

...et j'avais pas fait gaffe, mais plus rapide en debug ça m'étonnerait bcp! :o

n°750856
zifox
Posté le 03-06-2004 à 15:06:33  profilanswer
 

oui ca m'etonne aussi :D :D

n°753160
jesus_chri​st
votre nouveau dieu
Posté le 05-06-2004 à 00:42:58  profilanswer
 

En Debug, le compilo insère dans le code une multitude d'infos te permettant de surveiller le soft, de le stopper avec des breakpoints, de capturer les exception etc...
 
Ceci alourdi l'executable et le rend un peu plus lent.
 
En release il n'y a que le code utile, donc c'est + petit et + léger mais moins "sécurisé" donc il faut simplement développer en debug et livrer en release.
 
Note bien que selon des infos de debug inscrites dans l'exe, il peut être illégal de fournir un debug à un tiers car les données de debug ne sont pas toujours redistribuables. C'est notament le cas de visual c++

n°753202
christophe​_d13
L'efficacité à tout prix.
Posté le 05-06-2004 à 04:13:00  profilanswer
 

Une petite précision. Certains programmes ne fonctionne pas dans le mode Release par défaut de VC++ 6.0. Seul le mode Debug le permet. Donc on modifie le profil du mode Release pour le rendre identique au mode Debug, mais sans les informations de traçage.
 
Enfin, lors de la programmation de routine en asm, le mode Debug est plus tolérant sur l'utilisation des registres. En mode Release, c'est plus calamiteux (il faut toujours sauver ebx voire les autres registres...).

n°753283
HelloWorld
Salut tout le monde!
Posté le 05-06-2004 à 17:15:27  profilanswer
 

C'est que le Debug n'optimise pas. C'est pour ça qu'il est plus lent (en fait c'est release qui est plus rapide) et que trifouiller l'asm ne pose pas trop de pblm en Debug. Les allocations sont différentes aussi : des vérif sont faites, etc...
Quels prog ne fonctionnent pas en mode Release ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°753286
antp
Super Administrateur
Champion des excuses bidons
Posté le 05-06-2004 à 17:25:04  profilanswer
 

HelloWorld a écrit :


Quels prog ne fonctionnent pas en mode Release ?


 
Ceux qui débordent hors de la mémoire qu'ils allouent [:tinostar]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°753332
kadreg
profil: Utilisateur
Posté le 05-06-2004 à 18:04:53  profilanswer
 

antp a écrit :

Ceux qui débordent hors de la mémoire qu'ils allouent [:tinostar]


 
Ceux qui présupposent que tout est alloué à 0 ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°753353
antp
Super Administrateur
Champion des excuses bidons
Posté le 05-06-2004 à 18:25:51  profilanswer
 
mood
Publicité
Posté le 05-06-2004 à 18:25:51  profilanswer
 

n°753440
cricri_
Posté le 05-06-2004 à 19:23:13  profilanswer
 

ça au passage C -> C++ ça fait mal, j'en sais qqchose ...  :o  
 :pt1cable:

n°757770
jesus_chri​st
votre nouveau dieu
Posté le 09-06-2004 à 13:34:08  profilanswer
 

kadreg a écrit :

Ceux qui présupposent que tout est alloué à 0 ?

le debug de vc 6.0 met tout à 0xCCCCCCCC (1010101... en binaire), pas à 0.
 
désassemble le binaire produit par un debug, tu verras plein de

Code :
  1. mov mem, 0cccccccch

n°757924
HelloWorld
Salut tout le monde!
Posté le 09-06-2004 à 14:43:39  profilanswer
 

Il le fait que pour les variables sur la pile. 0xCC correspond à int 3h qui est une instruction de debug (program break).
Pour les variables static/global, je crios que c'est selon l'OS. VC++ ne fait rien d'autre que placer en section non initialisée, initialisée à zéro sous NT et pas sous 9x me semble-t-il.
http://msdn.microsoft.com/library/ [...] _build.asp
http://www.flounder.com/debug_release.htm


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°772022
christophe​_d13
L'efficacité à tout prix.
Posté le 21-06-2004 à 22:13:31  profilanswer
 

Dans tout les cas, utilisez les assertions !

n°772047
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 21-06-2004 à 22:22:41  profilanswer
 

christophe_d13 a écrit :

Dans tout les cas, utilisez les assertions !


Non :o
C'est crade, et si on oublie d'en virer une en mode release, ça rend le débuggage immonde car le message d'assertion échouée n'apparait pas en mode Release !
Et surtout, ça permet d'éviter au programmeur flemmard la programmation d'une gestion d'erreur digne de ce nom ! ("Toutes mes assertions passent en mode Debug ? Parfait, je vais pas me casser le cul avec des exceptions" ).
Bref, rien ne vaut une gestion des erreurs à base d'exception, pas ces trucs immondes d'assertions made in MFC :o


---------------
J'ai un string dans l'array (Paris Hilton)
n°772121
Joel F
Real men use unique_ptr
Posté le 21-06-2004 à 22:53:46  profilanswer
 

les seules assertions utiles sont les compile tim eassertion.
Le reste ca sert a rien, les exceptions sont bien meilleur.

n°772204
HelloWorld
Salut tout le monde!
Posté le 21-06-2004 à 23:54:39  profilanswer
 

En général, j'utilise les exceptions dans les fonctions membres public, les assert sinon.

Citation :

les seules assertions utiles sont les compile tim eassertion.


C'est koi une compile time assertion ?


Message édité par HelloWorld le 21-06-2004 à 23:55:28

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°772285
Joel F
Real men use unique_ptr
Posté le 22-06-2004 à 08:35:04  profilanswer
 

une assertion qui se declenchent à la compilation.
 
http://www.boost.org/libs/static_a [...] assert.htm

n°772286
SoWhatIn22
Posté le 22-06-2004 à 08:35:24  profilanswer
 

Joel F a écrit :

les seules assertions utiles sont les compile tim eassertion.
Le reste ca sert a rien, les exceptions sont bien meilleur.


Non. Les assertions c'est bien, mangez en.
 
Rien de tel pour débugger un programme. Ca fait gagner un temps fou lors du dev. Et une assertion qui claque, c'est une rupture de contrat, donc un comportement anormal. Mieux vaut arrêter le programme, corriger le code, et reprendre plus tard. Et sous unix, l'assertion a le bon gout de produire un fichier core que tu peux analyser par la suite.  
 
Une exception & une exception, ça n'a pas la même utilité. Ce sont 2 principes très différents.

n°772289
Joel F
Real men use unique_ptr
Posté le 22-06-2004 à 08:37:03  profilanswer
 

SoWhatIn22 a écrit :


Rien de tel pour débugger un programme. Ca fait gagner un temps fou lors du dev. Et une assertion qui claque, c'est une rupture de contrat, donc un comportement anormal. Mieux vaut arrêter le programme, corriger le code, et reprendre plus tard. Et sous unix, l'assertion a le bon gout de produire un fichier core que tu peux analyser par la suite.  


 
mouais certes .... mais la plupart des assertions se remplacent naturellement par de simples tests de pre ou post conditions.

n°772295
printf
Baston !
Posté le 22-06-2004 à 08:42:43  profilanswer
 

Harkonnen a écrit :

Non :o
C'est crade, et si on oublie d'en virer une en mode release, ça rend le débuggage immonde car le message d'assertion échouée n'apparait pas en mode Release !
Et surtout, ça permet d'éviter au programmeur flemmard la programmation d'une gestion d'erreur digne de ce nom ! ("Toutes mes assertions passent en mode Debug ? Parfait, je vais pas me casser le cul avec des exceptions" ).
Bref, rien ne vaut une gestion des erreurs à base d'exception, pas ces trucs immondes d'assertions made in MFC :o


 
:??:
C'est pas spécifique aux MFC les assertions (la macro assert() existe en ANSI C, par exemple).
Moi je trouve ça relativement pratique... faut dire que la gestion des exceptions en C [:zerod]


---------------
Un matin je me lèverai et il fera beau.
n°772301
Taz
bisounours-codeur
Posté le 22-06-2004 à 08:59:52  profilanswer
 

Joel F a écrit :

une assertion qui se declenchent à la compilation.
 
http://www.boost.org/libs/static_a [...] assert.htm

pour une fois je te prends pas en défaut

n°772302
Taz
bisounours-codeur
Posté le 22-06-2004 à 09:00:58  profilanswer
 

... juste pour ce qui comprendrais pas, par assertion, il faut  surtout pas entendre la macro assert du C

n°772303
printf
Baston !
Posté le 22-06-2004 à 09:06:36  profilanswer
 

Taz a écrit :

... juste pour ce qui comprendrais pas, par assertion, il faut  surtout pas entendre la macro assert du C


 
Quelqu'un a parlé de la macro assert() du C ici ? :o
 
Pourquoi ce n'est pas comparable :??: On m'aurait menti ? :(


---------------
Un matin je me lèverai et il fera beau.
n°772310
Taz
bisounours-codeur
Posté le 22-06-2004 à 09:12:21  profilanswer
 

parce que assert stop brutalement ton programme
parce que les assert son réduits en Noop en mode non-debug

n°772337
Joel F
Real men use unique_ptr
Posté le 22-06-2004 à 09:46:42  profilanswer
 

Taz a écrit :

pour une fois je te prends pas en défaut


 
j'ai compris maintenant ^^

n°772343
SoWhatIn22
Posté le 22-06-2004 à 09:56:38  profilanswer
 

Joel F a écrit :

mouais certes .... mais la plupart des assertions se remplacent naturellement par de simples tests de pre ou post conditions.


1. la plupart -> ok.
2. les pre et les post conditions ne peuvent pas toujours être évaluées à la compilation, loin s'en faut. Il faudrait que je jette un coup d'oeil au lien que tu as donné sur boost, car l'interêt me semble minime (je n'ai pas dit nul): ces pre/post conditions ne peuvent bien souvent être vérifiée qu'à l'execution.

n°772348
SoWhatIn22
Posté le 22-06-2004 à 09:59:50  profilanswer
 

Taz a écrit :

parce que assert stop brutalement ton programme
parce que les assert son réduits en Noop en mode non-debug


c'est justement l'intêret. Pourquoi continuer le programme alors qu'il y a une rupture de contrat. Quand on est en mode debug, alors meiux vaut arrêter tout de suite et debugger l'erreur qui vient de se produire, non? L'execution du programme se trouve peut être ralentie par tous ces tests, mais je suis prêt à en payer le prix si la qualité du debuggage s'en trouve améliorée. Et en plus, il n'en restera plus 1 trace en mode non-debug. parfait!

n°772354
Taz
bisounours-codeur
Posté le 22-06-2004 à 10:05:37  profilanswer
 

pourquoi ? parce que tu as un utilisateur, parce que tu as acquis des ressources et que tu dois les libérer selon un certain protocole.
 
perso, je rajoute des assert quand vraiment je debug, mais loin de moi l'idée d'écrire du code truffé d'assert à la con / sert à rien directement.
 
et même, je ne trouve pas les assert C pratique, je préfère une jolie exception qui remonte. d'autant plus que je ne vois pas pourquoi tu n'as besoin de respecter ton contrat qu'en mode debug ...

n°772396
SoWhatIn22
Posté le 22-06-2004 à 10:29:41  profilanswer
 

Taz a écrit :

pourquoi ? parce que tu as un utilisateur, parce que tu as acquis des ressources et que tu dois les libérer selon un certain protocole.
 
perso, je rajoute des assert quand vraiment je debug, mais loin de moi l'idée d'écrire du code truffé d'assert à la con / sert à rien directement.
 
et même, je ne trouve pas les assert C pratique, je préfère une jolie exception qui remonte. d'autant plus que je ne vois pas pourquoi tu n'as besoin de respecter ton contrat qu'en mode debug ...


pour la libération des ressources, si vraiment tu as un soucis avec ça, alors ok. Peu de programmes ont vraiment cette contrainte je pense. La plupart des ressources systèmes sont libérées par l'OS à la sortie du programme si cela n'a pas été fait explicitement. Mais parfois...
 
L'avantage de l'assert C, c'est que ça fait crasher le programme à l'endroit où le contrat est rompu et qu'on récupère tout le contexte d'exécution. On sait où a eu lieu le problème et on connait sa nature exacte. C'est gentil de récupérer une exception, mais t'en fait quoi? Tu refile le bébé à qqun d'autre? Un gestionnaire d'exception qui ferme les ressources proprement et qui dit au-revoir? En release ok, mais pas en debug. Je prefère avoir le contexte de plantage et gagner un temps précieux.
Ceci dit, je suis bien d'accord avec toi: tu n'as pas plus besoin de respecter ton contrat en mode debug que dans un autre mode. Par contre, en debug, on peut(doit?) se permettre de vérifier les contrats un peu plus souvent. Ca permet de vite trouver les erreurs d'étourderies et autres bêtises de copier/coller malheureux. En plus, un contrat bien formulé permet de laisser un code plus lisible pour ceux qui doivent passer derrière.

n°772403
Taz
bisounours-codeur
Posté le 22-06-2004 à 10:35:23  profilanswer
 

déjà ce n'est pas le cas pour les descripteurs de fichiers, après tu peux posséder des verrous ou avoir établis des connexions (réseau, sgdb) pour lesquelles il faut suivre un protocole. et pense à ton utilisateur. on ne vérifie pas de contrat avec des assert. on s'en essentiellement pour vérifier que le programme tourne bien comme on le pense, pas par pas

n°772418
SoWhatIn22
Posté le 22-06-2004 à 10:43:39  profilanswer
 

>  déjà ce n'est pas le cas pour les descripteurs de fichiers
ah? tu m'étonnes là... faudra que je vérifie quand même :)
 
> après tu peux posséder des verrous ...
je me répète, mais dans ce cas, ok... et encore, si tu as un client serveur avec un serveur qui ne supporte pas la déconnexion brutale de ton client, y'a comme un pb. Change de serveur, sinon à la première coupure réseau il est en rade...
 
> et pense à ton utilisateur
justement, je pense à lui! Plus mon programme sera debuggé, moins l'utilisateur d'une version "de production" sera confronté à des bugs. Une verison de production et une version de debug, ce n'est à mon sens pas tout à fait la même chose.
 
> on ne vérifie pas de contrat avec des assert
en mode debug on fait une première vérification avec le assert et en plus on crash si le contrat n'est pas vérifié. Si la vérification du contrat doit être faite en mode non-debug aussi, alors on rajoute après la vérification du contrat qui génère une exception en cas de rupture
 

n°772421
Taz
bisounours-codeur
Posté le 22-06-2004 à 10:45:28  profilanswer
 

c'est pas une raison pour quitter brutalement si tu peux l'éviter. si tu debug ton programme, tu peux envisager de le planter 2/3x par minutes ...
 
dans tous les cas avec tes assert, tu l'as dans l'os ... va t'en faire des tests unitaires avec des assert, reviens après

n°772426
SoWhatIn22
Posté le 22-06-2004 à 10:49:29  profilanswer
 

si, c'est une bonne raison parce que tu identifies la source du problème immédiatement. je trouve donc cela franchement plus simple pour localier l'erreur, et donc plus rapide pour corriger.
donc l'assert c'est bien dans *presque* tous les cas :)
 
je vois pas en quoi ça pose un problème pour faire des tests unitaires. De toute façon ça rime à quoi de faire des tests unitaires avec un programme si tu sais qu'il est bancal. Qui te dis qu'il se comportera encore de la même façon une fois que tu aurras coorigé le 1er problème.
En debug, préferrer continuer plutôt que de s'arrêter, je ne vois pas l'interêt.

n°772436
Taz
bisounours-codeur
Posté le 22-06-2004 à 10:54:23  profilanswer
 

et bien quand tu as une batterie de tests, planter sur le premier problème, ça t'empêche justement d'observer globalement le problème. avec ton gentil assert, tu va te focaliser pour que bordel de merde, ça plante plus sur ce putain d'assert, tu  vas tout faire et si ça se trouve du même coup casser sans le savoir une autre partie de ton composant

n°772443
HelloWorld
Salut tout le monde!
Posté le 22-06-2004 à 10:58:24  profilanswer
 

Ben assert est exception c'est pas fait pour la même chose. L'assertion n'est pas faite pour vérifier des paramètres / checker une allocation.
L'assert est pour moi plus proche du commentaire que de la vérification.
assert( condition );
Indique qu'à ce point dans le programme, si tout a été fait comme il faut, condition est toujours vrai. Autre utilité, le fait que ça dégage en Release, pour rajouter du code de vérif supplémentaire. C'est comme ça sous VC++ par exemple que la lib test si tu delete 2 fois de la mémoire, etc...
Je les trouve très utiles dans les classes de base, car quand on la dérive qq demaines plus tard, on a vite fait d'oublier un truc à la con qui va te prendre plusieures heures à trouver.
Exemple bête :

Code :
  1. class DataBufferBase
  2. {
  3. public:
  4.     ~DataReaderBase();
  5. protected:
  6.     void AllocBuffer(size_t);
  7.     void FreeBuffer();
  8. private:
  9.     unsigned char * Buffer;
  10. };
  11. DataReaderBase::~DataReaderBase()
  12. {
  13.     assert( Buffer == 0 );
  14.     // ne devrait jamais se produire
  15.     if ( this->Buffer != 0 )
  16.     {
  17.         this->FreeBuffer();
  18.     }
  19. }


Peut importe ce que fait cette classe, disons qu'elle gère une lecture bufferisée de fichier. Elle sert de base à d'autres classes.
Le contrat, comme dit SoWhatIn22, c'est que le buffer ne sert que pendant la lecture. Comme il est volumineux, il convient de le libérer dès qu'on n'en n'a plus besoin.
Donc on doit pas arriver au destrcuteur avec un buffer plein.
Mais si ça se produit, ben on le libère, sans tout faire planter. Mais en Debug il est bon de signaler qu'il faut le libérer plus tôt.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°772445
SoWhatIn22
Posté le 22-06-2004 à 11:00:49  profilanswer
 

bah non: si tu tombes sur ce problème, tu essayes d'en comprendre la cause. Le contrat te donnes l'erreur, à toi d'en trouver la cause. Si le contrat est rompu, c'est que ya eu un pb avant l'erreur, pas après :D je ne comprends pas en quoi continuer à éxécuter le programme va t'aider à localiser le problème.

n°772448
Taz
bisounours-codeur
Posté le 22-06-2004 à 11:03:06  profilanswer
 

moi je parle qu'il faut banir les assert à tout prix
 
mais je reste perplexe devant ton exemple

n°772450
Taz
bisounours-codeur
Posté le 22-06-2004 à 11:03:56  profilanswer
 

SoWhatIn22 a écrit :

je ne comprends pas en quoi continuer à éxécuter le programme va t'aider à localiser le problème.

ben si justement...

n°772460
SoWhatIn22
Posté le 22-06-2004 à 11:12:01  profilanswer
 

Taz a écrit :

ben si justement...

nan nan, je t'assure que je n'ai pas compris :D

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

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

  VC++ : Release VS Debug ?

 

Sujets relatifs
IntelliJ est-il en train de se JBuilderiser avec sa release 4de l'utilité d'une methode release dans un tag jsp.
Probléme de debug[DevCpp] Programme qui fonctionne en debug seulement
[ECLIPSE] Passer en debug dans un programme [RESOLU]Lotus Domino release 5 debuter...
Open Watcom 1.2 releaseDebug sous Kawa
Visual C++ difference entre mode debug et execDebug web avec visual studio .NET 2002
Plus de sujets relatifs à : VC++ : Release VS Debug ?


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