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
}
}
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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 ?
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
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.
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.
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.
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 ?
On Wed, 13 Jul 2005 14:41:32 +0200, bernard tatin
<bernard.tatin@nospam.tele2.fr.invalid>:
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 ?
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 ?
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
bernard tatin <bernard.tatin@nospam.tele2.fr.invalid> 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 ?
| 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
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.
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
}
}
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.
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.
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.
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.
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.
bernard tatin <bernard.tatin@nospam.tele2.fr.invalid> 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 ...).
| 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.
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.
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.
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.
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.
bernard tatin wrote:
Je me suis un peu gouré c'est -mthreads avec un _s_.