OVH Cloud OVH Cloud

exceptions, threads et g++

9 réponses
Avatar
bernard tatin
Bonjour,

Je fais un programme en C++ qui utilise des threads et des exceptions.
Je le compile sans problème sous Windows ou Unix (Mac OS X, en fait)
avec g++. Pour Windows XP, j'utilise le g++ qui va avec Dev C++ et pour
le Mac, le gcc fourni par Apple.

Lorsqu'une exception est lancée dans un thread, qu'il soit le thread
principal ou n'importe quel autre thread, tout se passe bien sur MacOS
et ça plante très régulièrement sur Windows XP (faute de protection),
quelle que soit la machine. Et cela semble grave, car je n'arrive pas à
la capter avec le débugueur.


Est-ce que quelqu'un aurait des pistes à me fournir ? Cela m'éviterais
de refaire toute ma gestion d'erreur sans exception (et sans jeu de mot).

A noter que je fais très attention à la gestion des exceptions. Les
threads sont tous de la forme :

void *mon_thread(void *param) {
try {
// tout le boulot
}
catch(TypeException1 e) {
}
catch(TypeException2 e) {
}
// ...
catch(TypeExceptionn e) {
}
catch(...) {
// pour être sûr de ne rien laisser passer
}
}

Merci,

Bernard.

9 réponses

Avatar
Loïc Joly
Bonjour,

Je fais un programme en C++ qui utilise des threads et des exceptions.
Je le compile sans problème sous Windows ou Unix (Mac OS X, en fait)
avec g++. Pour Windows XP, j'utilise le g++ qui va avec Dev C++ et pour
le Mac, le gcc fourni par Apple.

Lorsqu'une exception est lancée dans un thread, qu'il soit le thread
principal ou n'importe quel autre thread, tout se passe bien sur MacOS
et ça plante très régulièrement sur Windows XP (faute de protection),
quelle que soit la machine. Et cela semble grave, car je n'arrive pas à
la capter avec le débugueur.


Qu'est-ce qui te pousse à croire qu'il y a un lien avec les exception ?

--
Loïc

Avatar
bernard tatin

Bonjour,

Lorsqu'une exception est lancée dans un thread, qu'il soit le thread
principal ou n'importe quel autre thread, tout se passe bien sur MacOS
et ça plante très régulièrement sur Windows XP (faute de protection),
quelle que soit la machine. Et cela semble grave, car je n'arrive pas
à la capter avec le débugueur.



Qu'est-ce qui te pousse à croire qu'il y a un lien avec les exception ?



Avec un seul thread (le thread principal), le lancement d'une exception
ne provoque pas d'erreur. Lorsque j'ajoute un ou plusieurs threads,
l'envoi d'une exception provoque le plantage.

Pour débugger, j'ai fait des bistouilles du genre :
#define THROW(exception e)
{ printf("Avant throw"); throw exception(...); }
et dans tous les catch, un printf. Lors des crashes, j'ai toujours
l'affichage d'avant throw et jamais rien après.

J'en déduis donc :
1 - c'est bien au lancement de l'exception, mes debugs me semblent
suffisamment éloquent,
2 - cela n'arrive qu'en multi-thread,

d'où ma conclusion.

En fait, je n'arrive pas à capter le crash avec le débugger car il est
gelé, plus de réactions, rien, je suis obligé de tuer l'exécutable à
débugger et alors le débugger reprend vie.

Je le répète, cela ne m'arrive que sous XP, pas sous Mac OS.

Bernard.


Avatar
Fabien LE LEZ
On Wed, 13 Jul 2005 14:41:32 +0200, bernard tatin
:

Pour Windows XP, j'utilise le g++ qui va avec Dev C++


Quelle version de gcc ? As-tu essayé de voir avec une autre version ?

Avatar
Gabriel Dos Reis
bernard tatin writes:

| Bonjour,
|
| Je fais un programme en C++ qui utilise des threads et des
| exceptions. Je le compile sans problème sous Windows ou Unix (Mac OS
| X, en fait) avec g++. Pour Windows XP, j'utilise le g++ qui va avec
| Dev C++ et pour le Mac, le gcc fourni par Apple.

Que donne "g++ -v" sur les machines où ça plante ?

-- Gaby
Avatar
tonton
bernard tatin wrote:
Bonjour,

Je fais un programme en C++ qui utilise des threads et des exceptions.
Je le compile sans problème sous Windows ou Unix (Mac OS X, en fait)
avec g++. Pour Windows XP, j'utilise le g++ qui va avec Dev C++ et pour
le Mac, le gcc fourni par Apple.

Lorsqu'une exception est lancée dans un thread, qu'il soit le thread
principal ou n'importe quel autre thread, tout se passe bien sur MacOS
et ça plante très régulièrement sur Windows XP (faute de protection),
quelle que soit la machine. Et cela semble grave, car je n'arrive pas à
la capter avec le débugueur.


Est-ce que quelqu'un aurait des pistes à me fournir ? Cela m'éviterais
de refaire toute ma gestion d'erreur sans exception (et sans jeu de mot).



Mingw32 (le compilateur utilisé par devcpp) a besoin de l'option
-mthread sur la ligne de commande pour pouvoir utiliser des exceptions
et des threads. Il doit y avoir une case a cocher quelque part dans les
options (ca fait très longtemps que je n'ai pas utilisé devcpp, je ne
peut pas préciser ou et sous quel nom)

A noter que je fais très attention à la gestion des exceptions. Les
threads sont tous de la forme :

void *mon_thread(void *param) {
try {
// tout le boulot
}
catch(TypeException1 e) {
}
catch(TypeException2 e) {
}
// ...
catch(TypeExceptionn e) {
}
catch(...) {
// pour être sûr de ne rien laisser passer
}
}

Merci,

Bernard.


Avatar
bernard tatin
Mingw32 (le compilateur utilisé par devcpp) a besoin de l'option
-mthread sur la ligne de commande pour pouvoir utiliser des exceptions
et des threads. Il doit y avoir une case a cocher quelque part dans les
options (ca fait très longtemps que je n'ai pas utilisé devcpp, je ne
peut pas préciser ou et sous quel nom)




Aïïe nom de ... Je ne pourrais l'essayer que Lundi (pas de PC, pas de
Windows à la maison), mais mon petit doigt me dit qu'on est sur la bonne
voie !

J'étais persuadé que c'était un truc de ce style, je le teste Lundi
matin de bonne heure.

Pour la dernière version, il y a une boîte de dialogue qui permet de
préciser les options de compilation comme -O3,ou de link, comme -s en
direct.

Mille fois, cent mille fois merci !

Bernard.

Avatar
bernard tatin
bernard tatin writes:

| Bonjour,
|
| Je fais un programme en C++ qui utilise des threads et des
| exceptions. Je le compile sans problème sous Windows ou Unix (Mac OS
| X, en fait) avec g++. Pour Windows XP, j'utilise le g++ qui va avec
| Dev C++ et pour le Mac, le gcc fourni par Apple.

Que donne "g++ -v" sur les machines où ça plante ?

-- Gaby


Je pense, j'espère, je souhaite très fortement que la réponse est donnée
par 'tonton', plus haut, mais je ne peux la tester que Lundi matin, pas
de PC à la maison.

Ceci dit, j'avais fait des tests de ce style, mais rien ne me donnait de
piste sérieuse. Même un test sous Linux avec une version de compilateur
équivalente à celle de Dev C++ me donne de bons résultats! C'est (donc)
certainement un problème spécifique à Windows. L'option -mthread ne
m'est pas connue sous Unix (Linux, Mac OS X ...).

Merci,

Bernard.

Avatar
tonton
bernard tatin wrote:

Mingw32 (le compilateur utilisé par devcpp) a besoin de l'option
-mthread sur la ligne de commande pour pouvoir utiliser des exceptions
et des threads. Il doit y avoir une case a cocher quelque part dans les
options (ca fait très longtemps que je n'ai pas utilisé devcpp, je ne
peut pas préciser ou et sous quel nom)




Je me suis un peu gouré c'est -mthreads avec un _s_.


Aïïe nom de ... Je ne pourrais l'essayer que Lundi (pas de PC, pas de
Windows à la maison), mais mon petit doigt me dit qu'on est sur la bonne
voie !


C'est toujours possible de faire de la cross-compilation (et souvent
c'est plus rapide), mais ca doit pas etre evident a mettre en place sur
un mac ...

J'étais persuadé que c'était un truc de ce style, je le teste Lundi
matin de bonne heure.


extrait de la page de man:
-mthreads
Support thread-safe exception handling on Mingw32. Code that relies
on thread-safe exception handling must compile and link all code with
the -mthreads option. When compiling, -mthreads defines -D_MT; when
linking, it links in a special thread helper library -lmingwthrd which
cleans up per thread exception handling data.

Juste un petit problème : cette option introduit une dépendance a la dll
mingwm10.dll


Pour la dernière version, il y a une boîte de dialogue qui permet de
préciser les options de compilation comme -O3,ou de link, comme -s en
direct.


oui c'est bien possible

Mille fois, cent mille fois merci !


de rien

Bernard.



Avatar
bernard tatin
bernard tatin wrote:


Je me suis un peu gouré c'est -mthreads avec un _s_.


C'est pas grave, c'était la bonne réponse.

Merci encore.

Bernard.