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

QxOrm Discussion :

glibc - double free or corruption


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 22
    Points
    22
    Par défaut glibc - double free or corruption
    Bonjour,
    Lors de l'exécution de mon application, j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *** glibc detected *** /home/sbonnemaison/workspace/c++/sdbs.inforsure/IFSProxy/build-debug/src/ifsproxy-1.0: double free or corruption (fasttop): 0x00007fffc40048e0 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x391ec7a8c6]
    /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.4/libstdc++.so.6(_ZNSs6assignERKSs+0x85)[0x394f09c8b5]
    /usr/lib64/libQxOrm.so.1(_ZN2qx5trait6detail26get_sql_type_by_class_nameEPKcS3_+0xaf)[0x7ffff4e9435f]
    L'appel est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SyncEntityList list;
    	QSqlError dao_error = qx::dao::fetch_by_query(query, list,
    			&conn->getConnection());
    C'est erreur existe depuis que j'ai mis à jour les librairies de mon application : boost, qxorm.
    Est-il possible que cela soit lié à une option de compilation ? A l'utilisation du multi-tâche ?

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    A l'utilisation du multi-tâche ?
    Non je ne pense pas.

    EDIT: Fais quand même attention à ton "&conn->getConnection()", en effet, avec la classe QSqlDatabase, ton instance de connexion doit être créées dans le même thread que l'exécution de ta requête (QxOrm le gère automatiquement, mais dans ton cas, tu forces toi-même la connexion donc faut faire attention).
    Plus de détails sur le site de Qt : http://doc-snapshot.qt-project.org/4...ldatabase.html

    à une option de compilation ?
    Peut-être, mais ça va être compliqué de t'aider sans plus de détails.
    Est-ce que tu laisses les valeurs par défaut quand tu compiles QxOrm ?
    Ou bien tu actives QxMemLeak ou autre chose ?
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Le problème survient plus précisément lors du traitement de la méthode const char * get_sql_type_by_class_name() lors de l'appel de la méthode std::string::assign().
    Je ne penses pas que cela soit lié à la connexion à la base de donnnées. Il y a une variable statique manipulé lors du traitement de cette méthode.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Le problème survient plus précisément lors du traitement de la méthode const char * get_sql_type_by_class_name() lors de l'appel de la méthode std::string::assign().
    Oula, ça va être compliqué pour t'aider : personne ne m'a remonté cette erreur jusqu'à maintenant, et je n'arrive pas à la reproduire !
    Si tu peux envoyer un petit projet de test que je peux compiler facilement et qui reproduit ton erreur, je suis preneur...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    En attendant de terminer de préparer un petit projet, ci-dessous le code source de la partie qui implémente l'accès aux données :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    +Header
    class SAMRequestEntity: public BaseEntity {
    	QX_REGISTER_FRIEND_CLASS( sdbs::ifs::SAMRequestEntity)
     
    public:
    	IFSENTITY_DECL(SAMRequestEntity)
     
     
    	/**
             * Enums & Consts
             */
    	...
     
    	/**
             *
             */
    	static boost::shared_ptr<SAMRequestEntity> next(
    			const EntityConnectionPtr &conn);
     
    	...
     
    	/**
             *
             */
    	static boost::shared_ptr<SAMRequestEntity> get(
    			const EntityConnectionPtr &conn, boost::uint64_t id);
     
    	/**
             * Constructor
             */
    	SAMRequestEntity(boost::uint64_t id = 0);
     
    	/**
             * Constructor
             */
    	SAMRequestEntity(const UserEntityPtr &user);
     
    	/**
             * Destructor
             */
    	virtual ~SAMRequestEntity() {
    	}
     
     
    	/**
             * Getters & Setters
             */
    	...
     
    	virtual void onAfterInsert(qx::dao::detail::IxDao_Helper * dao);
     
    	...
     
    private:
    	/// attributes
    	boost::uint64_t m_id;
    	/// date & time
    	QDateTime m_datetime;
    	/// user id
    	boost::uint64_t m_user;
    	/// IP address
    	QString m_host;
    	/// SAM request status
    	boost::uint16_t m_status;
    	/// SAM request content
    	QString m_content;
    	/// processing date & time
    	QDateTime m_datetime_done;
    };
     
    /// data type for a HTTPSAMRequestEntity pointer
    typedef boost::shared_ptr<SAMRequestEntity> SAMRequestEntityPtr;
    typedef qx::QxCollection<QString, SAMRequestEntityPtr> SAMRequestEntityList;
    typedef qx::QxCollectionIterator<QString, SAMRequestEntityPtr>
    		SAMRequestEntityIterator;
    + Source
    ...
     
    QX_REGISTER_COMPLEX_CLASS_NAME_CPP_APP(sdbs::ifs::SAMRequestEntity, sdbs_ifs_SAMRequestEntity)
     
    namespace qx {
     
    template<>
    void register_class(QxClass<sdbs::ifs::SAMRequestEntity> & t) {
    	t.setName("sam_request");
    	t.id(&sdbs::ifs::SAMRequestEntity::m_id, "sam_request_id", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_datetime, "sam_request_datetime", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_user, "sam_request_uid_id", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_datetime_done,
    			"sam_request_datetime_done", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_host, "sam_request_host", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_status, "sam_request_status", 1);
    	t.data(&sdbs::ifs::SAMRequestEntity::m_content, "sam_request_content", 1);
    }
     
    }
     
    ...
     
    IFSENTITY_REGISTER(SAMRequestEntity)
     
    /**
     * Consts
     */
    ...
     
    /**
     *
     */
    SAMRequestEntityPtr SAMRequestEntity::next(const EntityConnectionPtr &conn) {
    	qx::QxSqlQuery query(
    			QString::fromUtf8(
    					"WHERE sam_request.sam_request_status = :status LIMIT 1"));
    	query.bind(":status", STATUS_SAM_READY);
     
    	SAMRequestEntityList list;
    	QSqlError dao_error = qx::dao::fetch_by_query(query, list,
    			&conn->getConnection());
    	if (dao_error.isValid())
    		boost::throw_exception(
    				EntityQueryException(dao_error));
    	if (list.empty())
    		boost::throw_exception(EntityNotFoundException("No SAM request"));
    	return list.getFirst();
    }
     
    ...
     
    /**
     * Constructor
     */
    SAMRequestEntity::SAMRequestEntity(boost::uint64_t id) :
    	BaseEntity(), m_id(id), m_user(0), m_status(0) {
    	setLogger(PION_GET_LOGGER("sdbs.ifs.SAMRequestEntity"));
    }
     
    /**
     * Constructor
     */
    SAMRequestEntity::SAMRequestEntity(const UserEntityPtr &user) :
    	BaseEntity(), m_id(0), m_datetime(QDateTime::currentDateTime().toUTC()),
    			m_user(user->getId()), m_host("0.0.0.0"), m_status(STATUS_NONE) {
    	setLogger(PION_GET_LOGGER("sdbs.ifs.SAMRequestEntity"));
    }
     
    void SAMRequestEntity::onAfterInsert(qx::dao::detail::IxDao_Helper * dao) {
    	qx::QxSqlQuery query(QString::fromUtf8("WHERE oid = :oid"));
    	query.bind(":oid", (qlonglong) m_id);
     
    	SAMRequestEntityList list;
    	QSqlError dao_error =
    			qx::dao::fetch_by_query(query, list, &dao->database());
     
    	// If an error occured : transfert error to dao parameter
    	if (dao_error.isValid()) {
    		PION_LOG_ERROR(m_logger, "Failed to retrieve SAMRequestEntity[OID:" << m_id << "]");
    		dao->updateError(dao_error);
    	} else {
    		SAMRequestEntityPtr entity = list.getFirst();
    		m_id = entity->getId();
    		PION_LOG_DEBUG(m_logger, "SAMRequest #" << m_id);
    	}
    }
    Y a-t'il des erreurs d'implémentation ?

    L'arrêt du programme a lieu dans lors de l'appel de la méthode qx::dao::fetch_by_query() dans la méthode SAMRequestEntity::next(). Je précise que cette dernière est appelé au lancement du programme.

    J'utilise une base de données PostgreSQL 8.4 et Qt Sql 4.8.4.

    Ci-joint une capture écran de la pile d'appel dans la fenêtre de debug eclipse 4.2.1 cdt.
    Images attachées Images attachées  

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Le problème n'apparaît que si l'application est arrêté puis relancé.

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Y a-t'il des erreurs d'implémentation ?
    J'ai regardé vite fait ton code, ça me semble correct.

    Je précise que cette dernière est appelé au lancement du programme.
    ...
    Le problème n'apparaît que si l'application est arrêté puis relancé.
    Vraiment bizarre !
    Tu n'as pas moyen d'appeler ta méthode un peu plus tard qu'au lancement de l'appli ?

    En attendant de terminer de préparer un petit projet
    Pour moi le plus simple serait : tu pars d'un projet de test (./test/qxBlog/ par exemple), et tu apportes les modifs nécessaires pour reproduire ton problème...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 151
    Points : 49
    Points
    49
    Par défaut
    Je ne sais pas si ça peut aider, mais je pense que ce type d'erreur peut se corriger plus simplement avec valgrind. Il affichera l'endroit du code où il y a débordement, ou bien accès invalide.
    Ah et pendant que j'y pense, je conseille également cppcheck qui me permet de trouver des petites erreurs dans mon code.

Discussions similaires

  1. Réponses: 8
    Dernier message: 17/05/2019, 17h27
  2. glibc detected double free or corruption
    Par étoile de mer dans le forum Débuter
    Réponses: 3
    Dernier message: 30/09/2009, 16h05
  3. Réponses: 6
    Dernier message: 20/03/2009, 10h05
  4. [ProFTPd][glibc detected double free or corruption]
    Par Théolude dans le forum Administration système
    Réponses: 1
    Dernier message: 28/08/2008, 09h19
  5. erreur glibc detected double free or corruption.
    Par Screwt-K dans le forum C++
    Réponses: 1
    Dernier message: 02/07/2007, 16h46

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