OVH Cloud OVH Cloud

Différence Debug et Release et portabilité

2 réponses
Avatar
Ludo
Bonjour,

Je programme sous Visual C++ 6. J'ai écrit un programme qui à l'origine
était destiné à être utilisé par moi seul. Comme je n'étais pas un pro
de Visual C++, je n'avais même pas vu que l'on pouvait faire la
distinction entre version Debug et version Release lors de la
compilation. Il se trouve que j'utilise ce programme depuis plus d'un an
et qu'il marchait bien (donc en version Debug) sur ma machine.
Seulement des amis à moi voulait l'utiliser alors je leur ai envoyé mon
.exe ainsi que les différentes dll de debug nécessaires pour
l'utilisation de mon .exe (mfc42d.dll, msvcrtd.dll et mfco42d.dll). Mais
voilà que chez eux le programme plante en faisant une "Debug Assertion
Failed", en gros je pense qu'il y a un bug quelque part et que le debug
ne fonctionne pas (normal puisqu'il n'ont pas Visual C++ chez eux).
Première question donc, comment se fait-il que mon programme marche bien
sur ma machine et pas chez eux ?
Je continue.
Je me suis donc aperçu qu'il y avait une possibilité de compiler une
version Release, ce que j'ai fait. Mais voilà que celle-ci bugue sur ma
machine (apparement au même endroit que ma version Debug chez les autres).
Deuxième question donc : est-ce normal que la version Release bugue
alors que la Debug ne bugue pas sur ma machine ?
Et pour finir, le plus étrange. Je vous envoie une partie de mon code
(attention, je suis conscient que vous ne comprendrez quasiment rien).
Ce qui est bizarre c'est que lorsque je rajoute une ligne affichant
simplement une MessageBox avec une ligne de texte, ma version Release se
met à marcher et quand je la renlève, paf ça se remet à planter !
Troisième et dernière question : d'où cela peut-il venir ? Je n'ai
aucune idée vers laquelle me diriger pour résoudre ce problème !

Je vous remercie pour votre aide.

void CPointeuseView::OnUpdate( CView* pSender, LPARAM lHint, CObject*
pHint )
{
//On va d'abord réinitialiser tout le tableau
this->m_Planning.SetRows(1);
this->m_Planning.SetRows(2);

//Il faut charger les données du document (travail)
int i=0,j=0,k=1;
CJourneeTravail* pJournee;
CHoraire* horaire;
int nbJoursTotal = this->GetDocument()->GetTravail()->NbJoursTotal();
CString mess="Nombre total de jours : ";
char nbs[2];
itoa(nbJoursTotal,nbs,10);
mess += nbs;
this->MessageBox(mess);
while (i < nbJoursTotal) //Tant qu'il y a des jours
{
this->MessageBox("to OnUpdateDansBoucleJours1");
//Pour chaque jour on va ajouter dans le tableau ses horaires
j=0;
pJournee=this->GetDocument()->GetTravail()->GetJourneeNumero(i);
while (j<pJournee->NbHoraires())
{
Lorsque j'enlève la ligne suivanrter, ça plante !!!!!
this->MessageBox("to OnUpdateDansBoucleHoraires1");
horaire=pJournee->HoraireNumero(j);
//Affichage du jour
this->m_Planning.SetRow(k);
this->m_Planning.SetCol(0);
char buf1[2],buf2[2],annee[4];
itoa(pJournee->GetJour(),buf1,10);
CString texte=buf1; texte+= "/";
itoa(pJournee->GetMois(),buf2,10);
if (pJournee->GetMois()<10) texte+="0";
texte+= buf2; texte+= "/";
itoa(pJournee->GetAnnee(),annee,10);
texte+= annee;
this->m_Planning.SetText(texte);
//Affichage de l'heure de début
this->m_Planning.SetCol(1);
itoa(horaire->GetHeureDebut(),buf1,10);
texte=buf1; texte+=":";
itoa(horaire->GetMinuteDebut(),buf2,10);
if (horaire->GetMinuteDebut()<10)
texte+="0";
texte+=buf2;
this->m_Planning.SetText(texte);
//Affichage de l'heure de fin
this->m_Planning.SetCol(2);
itoa(horaire->GetHeureFin(),buf1,10);
texte=buf1; texte+=":";
itoa(horaire->GetMinuteFin(),buf2,10);
if (horaire->GetMinuteFin()<10)
texte+="0";
texte+=buf2;
this->m_Planning.SetText(texte);
//Affichage de la consommation d'un repas
this->m_Planning.SetCol(3);
if (horaire->GetRepas())
this->m_Planning.SetText("Repas pris");
else
this->m_Planning.SetText("");

j++;//On passe à l'horaire suivant de la journée

k++;//On passe à la ligne du tableau suivante
this->m_Planning.SetRows(k+1);
}
i++;
this->MessageBox("to OnUpdate finboucleHoraires");
}
this->MessageBox("to OnUpdate finbouleJours");
this->m_Planning.SetRowSel(this->m_Planning.GetRows()-1);
this->MessageBox("to finOnUpdate");
}

2 réponses

Avatar
Nico
"Ludo" a écrit dans le message de
news:
Bonjour,

Je programme sous Visual C++ 6. J'ai écrit un programme qui à l'origine
était destiné à être utilisé par moi seul. Comme je n'étais pas un pro
de Visual C++, je n'avais même pas vu que l'on pouvait faire la
distinction entre version Debug et version Release lors de la
compilation. Il se trouve que j'utilise ce programme depuis plus d'un an
et qu'il marchait bien (donc en version Debug) sur ma machine.
Seulement des amis à moi voulait l'utiliser alors je leur ai envoyé mon
.exe ainsi que les différentes dll de debug nécessaires pour
l'utilisation de mon .exe (mfc42d.dll, msvcrtd.dll et mfco42d.dll). Mais
voilà que chez eux le programme plante en faisant une "Debug Assertion
Failed", en gros je pense qu'il y a un bug quelque part et que le debug
ne fonctionne pas (normal puisqu'il n'ont pas Visual C++ chez eux).
Première question donc, comment se fait-il que mon programme marche bien
sur ma machine et pas chez eux ?


Ca peut dépendre de plein de choses: de ce qui est installé ou non, du
hasard ...

Je continue.
Je me suis donc aperçu qu'il y avait une possibilité de compiler une
version Release, ce que j'ai fait. Mais voilà que celle-ci bugue sur ma
machine (apparement au même endroit que ma version Debug chez les autres).
Deuxième question donc : est-ce normal que la version Release bugue
alors que la Debug ne bugue pas sur ma machine ?


Oui, çà se produit souvent.
En général, ca se produit quand il y a des variables non initialisées ou des
ecrasements memoire en particulier.
La version Debug initialise les variables avec des valeurs particulières
(peut-etre A5 si je me souviens bien) tandis que la version Release
n'inialise pas les variables (on a la valeur qu'il y avait en mémoire) :
donc certains tests pouvaient passer en Debug et ne plus passer en Release.
La version Debug ajout des octets autour des variables instanciées. Ca
masque en général des problèmes d'écrasements mémoire.
La version Release optimise les traitements et les allocations : elle peut
changer l'ordre de certains traitements ou transformer plusieurs variables
en une seule, ou tout autre optimisation utile...

Il peut y avoir d'autres raisons, mais à chaque fois c'est du à un bug dans
ton code.


Et pour finir, le plus étrange. Je vous envoie une partie de mon code
(attention, je suis conscient que vous ne comprendrez quasiment rien).
Ce qui est bizarre c'est que lorsque je rajoute une ligne affichant
simplement une MessageBox avec une ligne de texte, ma version Release se
met à marcher et quand je la renlève, paf ça se remet à planter !
Troisième et dernière question : d'où cela peut-il venir ? Je n'ai
aucune idée vers laquelle me diriger pour résoudre ce problème !




Je vous remercie pour votre aide.

void CPointeuseView::OnUpdate( CView* pSender, LPARAM lHint, CObject*
pHint )
{
//On va d'abord réinitialiser tout le tableau
this->m_Planning.SetRows(1);
this->m_Planning.SetRows(2);

//Il faut charger les données du document (travail)
int i=0,j=0,k=1;
CJourneeTravail* pJournee;
CHoraire* horaire;
int nbJoursTotal = this->GetDocument()->GetTravail()->NbJoursTotal();
CString mess="Nombre total de jours : ";
char nbs[2];


J'espère pour toi que nbJoursTotal est < 10, sinon écrasement mémoire.

itoa(nbJoursTotal,nbs,10);
mess += nbs;
this->MessageBox(mess);
while (i < nbJoursTotal) //Tant qu'il y a des jours
{
this->MessageBox("to OnUpdateDansBoucleJours1");
//Pour chaque jour on va ajouter dans le tableau ses horaires
j=0;
pJournee=this->GetDocument()->GetTravail()->GetJourneeNumero(i);
while (j<pJournee->NbHoraires())
{
Lorsque j'enlève la ligne suivanrter, ça plante !!!!!
this->MessageBox("to OnUpdateDansBoucleHoraires1");
horaire=pJournee->HoraireNumero(j);
//Affichage du jour
this->m_Planning.SetRow(k);
this->m_Planning.SetCol(0);
char buf1[2],buf2[2],annee[4];
itoa(pJournee->GetJour(),buf1,10);


Pareil, ca ne marche que si jour est < 10, ca doit pas etre souvent le cas

CString texte=buf1; texte+= "/";
itoa(pJournee->GetMois(),buf2,10);
if (pJournee->GetMois()<10) texte+="0";
texte+= buf2; texte+= "/";
itoa(pJournee->GetAnnee(),annee,10);
texte+= annee;
this->m_Planning.SetText(texte);
//Affichage de l'heure de début
this->m_Planning.SetCol(1);
itoa(horaire->GetHeureDebut(),buf1,10);
texte=buf1; texte+=":";
itoa(horaire->GetMinuteDebut(),buf2,10);
if (horaire->GetMinuteDebut()<10)
texte+="0";
texte+=buf2;
this->m_Planning.SetText(texte);
//Affichage de l'heure de fin
this->m_Planning.SetCol(2);
itoa(horaire->GetHeureFin(),buf1,10);
texte=buf1; texte+=":";
itoa(horaire->GetMinuteFin(),buf2,10);
if (horaire->GetMinuteFin()<10)
texte+="0";
texte+=buf2;
this->m_Planning.SetText(texte);
//Affichage de la consommation d'un repas
this->m_Planning.SetCol(3);
if (horaire->GetRepas())
this->m_Planning.SetText("Repas pris");
else
this->m_Planning.SetText("");

j++;//On passe à l'horaire suivant de la journée

k++;//On passe à la ligne du tableau suivante
this->m_Planning.SetRows(k+1);
}
i++;
this->MessageBox("to OnUpdate finboucleHoraires");
}
this->MessageBox("to OnUpdate finbouleJours");
this->m_Planning.SetRowSel(this->m_Planning.GetRows()-1);
this->MessageBox("to finOnUpdate");
}


Avatar
Alexandre Bacquart
Ludo wrote:

Je me suis donc aperçu qu'il y avait une possibilité de compiler une
version Release, ce que j'ai fait. Mais voilà que celle-ci bugue sur ma
machine (apparement au même endroit que ma version Debug chez les autres).


C'est toujours très jouissif de constater que la version Release ne
marche pas aussi bien que la version Debug, hein ? je compatis...

Deuxième question donc : est-ce normal que la version Release bugue
alors que la Debug ne bugue pas sur ma machine ?


Souvent, il s'agit de variables qui sont initialisées en debug, mais pas
en release (donc il peut y avoir n'importe quoi dedans). En release, le
compilo fait pas mal d'optimisations qui peuvent faire apparaître des
bugs qui sont sans effet en debug.

A chaque fois que ça m'est arrivé en tous cas, je me suis tiré les
cheveux à pester contre Visualtruc alors qu'en fait le bug était dans
mon programme.

Et pour finir, le plus étrange. Je vous envoie une partie de mon code
(attention, je suis conscient que vous ne comprendrez quasiment rien).


Bah, t'es pas le premier à poster du code qui n'intéresse personne ici !

Ce qui est bizarre c'est que lorsque je rajoute une ligne affichant
simplement une MessageBox avec une ligne de texte, ma version Release se
met à marcher et quand je la renlève, paf ça se remet à planter !
Troisième et dernière question : d'où cela peut-il venir ? Je n'ai
aucune idée vers laquelle me diriger pour résoudre ce problème !


Je vais pas m'amuser à chercher dans ton code ce que je répugne à
chercher dans le mien quand l'occasion se présente, mais j'ai une petite
remarque à faire : tu peux virer tous ces this->, c'est inutile et
plutôt laid.

Sinon, essaye d'initialiser toutes tes variables qui ne le sont pas, il
y a de fortes chances que ça te permette de résoudre ton problème, voire
de trouver quelle variable est en cause.



--
Tek