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

C++ Discussion :

Deque front() crash release


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut Deque front() crash release
    Bonjour,

    Je code un serveur de jeu et aujourd'hui j'ai tester le TCP/IP, tout fonctionne bien je push mes paquets dans le queue sans probleme mais quand j'appel front() en release j'obtient une erreur plutot etrange.
    Il me dit que ligne 140 de deque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _SCL_SECURE_VALIDATE_RANGE(_Myoff < ((_Mydeque *)(this->_Getmycont()))->_Myoff + ((_Mydeque *)(this->_Getmycont()))->_Mysize);
    _Myoff CXX0030: Error: expression cannot be evaluated

    J'ai essayer avec une list et j'ai le meme probleme...
    Note : Le meme code en debug fonctionne, c'est juste en release et j'avoue avoir chercher des heures sans la moindre reponse et sans espoir...
    EDIT : J'ai remarqué que si j'utilisais Multi-threaded Debug comme runtime library ca marche mais dés que je change vers Multi-threaded ca crash...

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Sans code on va avoir du mal à t'aider...

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    As tu vérifié que le deque n'est pas vide avant d'appeler front ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    Oui voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		   WorldPacket* pa = new WorldPacket;
                pa->push_back(packet.c_str(0,0),packet.size());
                _recvQueue.push(pa);
    			cout << _recvQueue.front()->size() << endl;
    Mais le problème c'est que que ca fonctionne parfaitement en debug, il me montre bien la taille du paquet...

    EDIT :

    J'ai continué a chercher et enfaite apparemment le problème survient dans la déclaration.
    Si j'écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                void (WorldSession::*_func[255])(WorldPacket*);
     
    			std::queue<WorldPacket*>	_recvQueue;
    			std::queue<WorldPacket*>    _sendQueueTcp,_sendQueueUdp;
    Ca ne marche pas, mais si j'inverse l'ordre de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
             	std::queue<WorldPacket*>	_recvQueue;
    			std::queue<WorldPacket*>    _sendQueueTcp,_sendQueueUdp;
     
    			void (WorldSession::*_func[255])(WorldPacket*);
    Ca marche...

    Personnellement, changer l'ordre de me dérange pas mais j'aimerais bien savoir pourquoi ce problème survient...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Je sens le "jardinage" mémoire.
    En clair, le code lit/écrit trop loin en mémoire.
    Résultat : des structures qui suivent les variables males utilisées sont endommagées.
    En Debug, des zone de mémoire de type canarie (pour la détection de ces anomalies dans l'utilisation de la mémoire) sont intercalées entre les structures. Cela permet de faire des détections de ces anomalies en mode débug, à condition d'utiliser les options de compilations ou les appels de fonction qui servent aux vérifications de ces canaries (très consommatrice en temps CPU).

    Cela expliquerait que le problème ne se montre pas en Debug.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par yamashi Voir le message
    Ca ne marche pas, mais si j'inverse l'ordre de déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
             	std::queue<WorldPacket*>	_recvQueue;
    			std::queue<WorldPacket*>    _sendQueueTcp,_sendQueueUdp;
     
    			void (WorldSession::*_func[255])(WorldPacket*);
    Ca marche...

    Personnellement, changer l'ordre de me dérange pas mais j'aimerais bien savoir pourquoi ce problème survient...
    Bonjour,
    Ca pourrait être un débordement de pile (récursion ou beaucoup d'autres tableau sur la pile ?).

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 124
    Points : 148
    Points
    148
    Par défaut
    Dans ce cas comment éviter ce genre de problème ?

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Corriger le débordement.
    Si le plantage est systématique en Release dans un scénario de test.
    Executes ce scénario de test en Debug et en utilisant les primitive de vérification du tas de la C-Runtime.

Discussions similaires

  1. Crash VBO en release
    Par roy_44 dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 16/06/2015, 16h09
  2. Réponses: 5
    Dernier message: 24/04/2015, 19h48
  3. Réponses: 6
    Dernier message: 25/11/2009, 15h18
  4. [VS2003] passage debug => release = crash
    Par Monstros Velu dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 17/07/2009, 16h18
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

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