IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] Plantage étrange en release et pas en debug


Sujet :

MFC

  1. #1
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut [MFC] Plantage étrange en release et pas en debug
    Bonjour à tous,

    Dans une appli MFC de browser d'images, j'ai un plantage en release et pas en debug. Pour localiser le bug, j'ai utilisé des Beep() dans mon code et là, stupeur, le plantage disparaît ! Il y a en particulier une ligne où un unique Beep() avec de mauvais paramètres (voir code ci-dessous) évite le crash.
    J'ai essayé de remplacer le Beep() par un Sleep(), pensant à un problème de synchronisation mais le plantage réapparaît.

    Quelqu'un a-t-il déjà eu ce problème ? D'où peut venir ce comportement ? Problème de mémoire, synchronisation, autre... ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    long CImageBrowser::DisplayImagesRange(long StartIndex, long StopIndex)
    {
    	long returnValue = 0;
    	long range = StopIndex - StartIndex;
     
    	if(range < 0 || StartIndex < 0 || StopIndex < 0 )
    		return -1;
    	if(StartIndex >= m_PathesArray.GetSize())
    	{
    		FreeDisplay();
    	//Update only the images side
    		InvalidateRect(m_rBrowserRect);
    		SetScrollInfo(0);
     
    		return -1;
    	}
    	if(range > m_Sizes.m_Nb_Visible_Vignettes)
    		returnValue = ResizeRange(StartIndex,StopIndex);
    	if(StopIndex > m_PathesArray.GetSize())
    		returnValue = ResizeRange(StartIndex,StopIndex);
     
    	if(returnValue < 0)
    		return returnValue;
     
    	FreeDisplay();
    	SetScrollInfo(0);
     
    ////////////
     
    	Beep(0,0);  //normalement, le premier paramètre (fréquence)
    				//doit être entre 37 et 32767
    ////////////
     
    //load images
    	for(int i=StartIndex;i<StopIndex;i++)
    		DisplayDefect(m_PathesArray.GetAt(i),i-StartIndex);
     
    	//Update only the images side
    	InvalidateRect(m_rBrowserRect);
     
    	m_DisplayedNumber = m_Sizes.m_Nb_Visible_Vignettes;
     
    	if(m_FirstImageIndex > m_DefectNumber - m_Sizes.m_Nb_Visible_Vignettes)
    		m_DisplayedNumber = m_DefectNumber - m_FirstImageIndex;
     
    	SetSelection(0,0);
     
    	return 0;
    }
    Je peux expliquer un peu plus le code de cette fonction si nécessaire.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    quelle version de vc tu utilises ?

  3. #3
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Pardon, j'utilise VC++ 6.0

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    ton probleme est symptomathique du debordement memoire .
    en rajoutant du code tu deplaces le probleme ...
    ton code au premier abord ne montre rien particulier.
    verifie quand meme ton index StartIndex qui peut provoquer un plantage sur l'acces à m_PathesArray.GetAt(


  5. #5
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    D'accord.

    Le fait que le type de fonction utilisée change le comportement s'explique-t-il par le fait qu'elle n'utilisent pas la même quantité de mémoire (je ne sais pas trop si ce que je dis à un sens, n'hésitez pas à me reprendre) ?

    Et comment pister un débordement mémoire ?
    [edit]Une recherche sur le terme débordement mémoire me donne quelques bonnes pistes à explorer...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Pour tracer à la place des beeps je mettrai des AfxMessageBox("lignexx")
    je verifierai aussi (entre autre) que les indices utilisés avec des containers objets (tableau ,array etc) soient toujours valides ....


  7. #7
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    J'ai modifié mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	CString msg;
    	msg.Format("StartIndex = %d ; StopIndex = %d",StartIndex,StopIndex);
    	AfxMessageBox(msg);
     
    //load images
    	for(int i=StartIndex;i<StopIndex;i++)
    	{
    		msg.Format("i = %d",i);
    		AfxMessageBox(msg);
    		DisplayDefect(m_PathesArray.GetAt(i),i-StartIndex);
    	}
     
    	AfxMessageBox("After DisplayDefect");
    Dans ce cas, les index sont corrects et tous se passe bien.

    Citation Envoyé par farscape
    je verifierai aussi (entre autre) que les indices utilisés avec des containers objets (tableau ,array etc) soient toujours valides ....
    Comment vérifier ces indices sans passer par le mode debug ?

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    en rajoutant des tests sur les indices avant utilisation...
    voir aussi macro VERIFY ou ASSERT en mode debug.

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ce problème est classique : en debug certaines variables sont initalisées à 0, pas en release, cherche aussi de ce côté.

  10. #10
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Bon je viens d'initialiser toutes les variables de ma fonction DisplayDefect(). Peut-être que ça n'a fait que déplacer le débordement mémoire mais en tout cas je n'ai plus de plantage.

    Est-ce que c'est une habitude qu'il faut que je prenne de toujours initialiser mes variables locales en début de fonction ?

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est impératif en C et aussi je pense en C++.
    Seule en C les variables globales sont initialisées à "0" (tous les octets sont à 0x00).

  12. #12
    Nouveau membre du Club Avatar de nmarf
    Inscrit en
    Mai 2003
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 92
    Points : 39
    Points
    39
    Par défaut
    Merci du conseil

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Acces violation avec la version release, mais pas la debug
    Par Matthieu Brucher dans le forum Qt
    Réponses: 5
    Dernier message: 07/03/2010, 21h20
  2. Réponses: 3
    Dernier message: 29/08/2009, 00h08
  3. Problème d'exécution en release mais pas en debug (2)
    Par animageo dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/11/2007, 14h22
  4. Problème Exécution en Release mais pas en Debug
    Par nono27200 dans le forum VB 6 et antérieur
    Réponses: 67
    Dernier message: 08/11/2007, 16h55
  5. [MFC] Plantage postmessage en release
    Par Hepm dans le forum MFC
    Réponses: 16
    Dernier message: 27/05/2006, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo