Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Invité de passage
    Inscrit en
    juin 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 33
    Points : 3
    Points
    3

    Par défaut glibc - double free or corruption

    Bonjour,
    Lors de l'exécution de mon application, j'obtiens l'erreur suivante :
    Code :
    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 :
    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
    Membre Expert

    Inscrit en
    avril 2010
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 376
    Points : 1 715
    Points
    1 715

    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
    Invité de passage
    Inscrit en
    juin 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 33
    Points : 3
    Points
    3

    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
    Membre Expert

    Inscrit en
    avril 2010
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 376
    Points : 1 715
    Points
    1 715

    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
    Invité de passage
    Inscrit en
    juin 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 33
    Points : 3
    Points
    3

    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 :
    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
    Invité de passage
    Inscrit en
    juin 2009
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : juin 2009
    Messages : 33
    Points : 3
    Points
    3

    Par défaut

    Le problème n'apparaît que si l'application est arrêté puis relancé.

  7. #7
    Membre Expert

    Inscrit en
    avril 2010
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : avril 2010
    Messages : 376
    Points : 1 715
    Points
    1 715

    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 à l'essai
    Inscrit en
    juin 2008
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 151
    Points : 20
    Points
    20

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •