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 :

Assertion failed et Boost.Asio


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut Assertion failed et Boost.Asio
    Bonjour à tous,

    Je travaille actuellement sur un projet personnel d'échange de données réseau.
    Lors de l'exécution en mode Debug, j'ai un magnifique plantage Debug Assertion Failed!
    Citation Envoyé par xstring,112
    string iterator not dereferencable
    puis OUT_OF_RANGE évidemment...

    En mode release, ce code ne donne aucun plantage. je dirai même qu'il donne entière satisfaction!

    Je sais bien qu'en release, les assertions sont désactivées, mais que tout fonctionne correctement derrière je trouve ça... presque louche !
    De plus, j'ai déjà utilisé dans mon programme plein de bouts de code similaires, qui passent en débug. Donc que tout fonctionne en release, bah je trouve ça presque normal !

    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
     
    void file_transfer_manager::handle_connect_ask(boost::shared_ptr<connection> new_connection, const std::string& filename, const boost::system::error_code& error)
    {
    	if (!error)
    	{
    		// On envoie les informations sur le fichier que l'on souhaite récupérer
    		generic_message msg;
    		msg.m_type = generic_message::FILE_INFORMATION;
    		msg.m_string = filename;
     
                    // sérialisation + envoi
    		new_connection->async_write(msg,
    			boost::bind(&file_transfer_manager::handle_ask, this,
    			boost::asio::placeholders::error)
    			);
    	} // Message ci dessus envoyé, et correctement reçu par le client distant!
               // Mais le callback ci dessous n'est jamais appelé...
    } // PLANTAGE après la fin de cette fonction, dans le fin fond
      // des appels de Boost::asio
     
    void file_transfer_manager::handle_ask(const boost::system::error_code& error)
    {
    	if (!error)
    	{
    		//
    	}
    }
    Lorsque je supprime l'appel réseau, plus de plantage...

    Ma question est
    : Est-ce qu'il peut avoir un problème dans boost::asio ou ailleurs ? (le débogage me donne une ligne dans boost::asio::buffer juste avant le plantage).
    Si c'est forcément mon code, mea culpa, et je retourne à ma débuggeur (débogage relativement difficile ici)



    Poukill

    EDIT : j'ai trouvé un post où une personne a un problème similaire ICI

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Ok solution trouvée après de longues recherches...
    Les variables doivent vivre jusqu'à l'exécution du callback inclus!
    J'ai donc rajouté des paramètres inutiles dans mon callback...

    Pourquoi cette différence debug / release, je sais pas. Mais me voilà tiré d'affaires!

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 120
    Par défaut
    Bonjour

    Je galère pas mal avec cette erreur. Des que j'envoie une string un peu trop longue je tombe sur cette assertion.
    Vu mon niveau en C++, je ne comprends pas trop comment faire pour l'éviter.

    Je suis parti du tutorial. Pour provoquer l'erreur il suffit d'envoyer un message depuis le serveur avec une string un peu longue.

    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
    void chat_session::handle_read(const boost::system::error_code &error)
    {
    	chat_room_ptr room = m_room.lock();
    	if (room)
    	{
    		if (!error)
    		{
    			// On demande à la room de transmettre le message à tout le monde
    			room->deliver(m_message);
     
    			chat_message e;
    			e.m_type = chat_message::NEW_MSG;
    			e.m_message = "Message bien reçu mais ca va planter gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg?";
    			deliver(e);
     
    			// On relance une écoute
    			wait_for_data();
    		}
    		else
    		{
    			if (!is_leaving)
    			{
    				is_leaving = true;
    				room->leave(shared_from_this() );
    			}
    		}
    	}
    }
    Les clients reçoivent bien le message mais le serveur plante sur l'exception.

    Quelqu'un pourrait m'expliquer ce que poukill a fait pour résoudre ce bug ?
    Quelqu'un sait ce qu'il se passe réellement ?

    Merci d'avance

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

Discussions similaires

  1. Debug Assertion Failed ! File: dbgheap.c
    Par jacques_henry dans le forum MFC
    Réponses: 9
    Dernier message: 15/04/2015, 11h29
  2. Assertion failed avec Boost.Python
    Par spartan811 dans le forum Boost
    Réponses: 0
    Dernier message: 15/05/2012, 15h27
  3. debug assertion failed...
    Par BnY dans le forum MFC
    Réponses: 2
    Dernier message: 18/04/2006, 16h49
  4. Réponses: 4
    Dernier message: 22/11/2005, 17h55
  5. Réponses: 3
    Dernier message: 07/12/2004, 22h09

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