Précédent   Forum du club des développeurs et IT Pro > C et C++ > Bibliothèques > Qt > Outils > Bibliothèques > QxOrm
QxOrm Forum d'entraide pour QxOrm
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/12/2012, 16h13   #1
ruddy32
Invité de passage
 
Inscription : 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 ?
ruddy32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2012, 15h28   #2
QxOrm
Membre Expert
 
Inscription : avril 2010
Messages : 331
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 331
Points : 1 219
Points : 1 219


Citation:
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

Citation:
à 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.

Tutoriel qxBlog
: gestion de blogs en C++/Qt.
Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.
QxOrm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2012, 23h22   #3
ruddy32
Invité de passage
 
Inscription : juin 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 33
Points : 3
Points : 3
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.
ruddy32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 14h24   #4
QxOrm
Membre Expert
 
Inscription : avril 2010
Messages : 331
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 331
Points : 1 219
Points : 1 219
Citation:
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.

Tutoriel qxBlog
: gestion de blogs en C++/Qt.
Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.
QxOrm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 13h49   #5
ruddy32
Invité de passage
 
Inscription : juin 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 33
Points : 3
Points : 3
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
Type de fichier : png debug_call_stack.png (238,6 Ko, 0 affichages)
ruddy32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2013, 13h38   #6
ruddy32
Invité de passage
 
Inscription : juin 2009
Messages : 33
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 33
Points : 3
Points : 3
Le problème n'apparaît que si l'application est arrêté puis relancé.
ruddy32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 09h25   #7
QxOrm
Membre Expert
 
Inscription : avril 2010
Messages : 331
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 331
Points : 1 219
Points : 1 219
Citation:
Y a-t'il des erreurs d'implémentation ?
J'ai regardé vite fait ton code, ça me semble correct.

Citation:
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 ?

Citation:
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.

Tutoriel qxBlog
: gestion de blogs en C++/Qt.
Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.
QxOrm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 11h15   #8
djarBoy
Membre à l'essai
 
Inscription : juin 2008
Messages : 142
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 142
Points : 20
Points : 20
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.
djarBoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h46.


 
 
 
 
Partenaires

Hébergement Web