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

C Discussion :

Critical error c0000374


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut Critical error c0000374
    Bonjour, je code actuellement un jeu avec la librairie SDL qui utilise plusieurs threads (mais que je ne suis pas sûr de gérer parfaitement), et jusqu'à maintenant mon jeu fonctionnait bien, j'ai voulu y rajouter quelques fonctionnalitées et c'est comme si tout c'était déréglé.

    Je m'explique : lorsque je lance le débogage, tout se lance parfaitement, la fenêtre s'ouvre et je peux jouer. Pendant environ une minute ou 2, rien de particulier ne se passe. Puis un point d'arrêt se déclenche et j'obtiens ces messages d'erreurs :

    Critical error detected c0000374
    Vaisseau.exe a déclenché un point d'arrêt.
    Exception de première chance à 0x7707AA3C (ntdll.dll) dans Vaisseau.exe*: 0xC0000374: Un segment de mémoire a été endommagé (paramètres*: 0x7708FE38).
    Exception non gérée à 0x7707AA3C (ntdll.dll) dans Vaisseau.exe*: 0xC0000374: Un segment de mémoire a été endommagé (paramètres*: 0x7708FE38).
    Exception de première chance à 0x6812362E (SDL.dll) dans Vaisseau.exe*: 0xC0000005*: Violation d'accès lors de la lecture de l'emplacement 0xFEEEFEF6.
    Exception non gérée à 0x6812362E (SDL.dll) dans Vaisseau.exe*: 0xC0000005*: Violation d'accès lors de la lecture de l'emplacement 0xFEEEFEF6.
    Et mon code s'arrête sur une instruction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(dataAffichage.tabAsteroide[i].imageEnMouvement != NULL)
    			SDL_FreeSurface(dataAffichage.tabAsteroide[i].imageEnMouvement);
    Parfois c'est une autre instruction mais c'est toujours sur un SDL_FreeSurface qui est pourtant précéder d'une condition.

    Et j'ai remarqué aussi en lançant le gestionnaire de tâche à côté que lorsque je lance mon jeu, la mémoire allouée est de 16.2 Mo et reste constante.. Pendant un certain temps. C'est à dire qu'après environ 1 minute de jeu, la mémoire allouée commence à grimper sans s'arrêter. Environ 0.5 Mo de mémoire est allouée en plus à chaque seconde, ce qui ne devrai pas être le cas.

    Enfin, si je ne poste pas mon code c'est parce que je ne sais vraiment pas d'où peut venir ce phénomène et je ne vais pas poster + de 500 lignes de codes..

    Si quelqu'un à une idée d'où pourrai venir l'erreur, je suis preneur..

    Merci d'avance !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Je pense que tu as une fuite de mémoire (tu alloues mais ne libère pas) ainsi qu'une erreur de segmentation (un pointeur qui pointe sur une zone non-allouée et qui fait n'importe quoi).

    Essaye d'utiliser valgrind, il devrait te donner quelques indications.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    Bonjour, et merci de ta réponse. J'ai regardé pour Valgrind mais je vois qu'il n'est pas supporté sur Windows. Alors j'ai regardé quelle alternative je pourrai utiliser. Je suis tomber sur Dr. Memory, j'ai suivis les instructions pour le mettre sur visual studio et lorsque je le lance je tombe sur ceci :

    Dr. Memory version 1.6.0
    Running "G:\USB\Vaisseau\Debug\Vaisseau.exe"
    WARNING: application exited with abnormal code 0xc0000005
    Je ne sais pas si ça peux indiquer quelques choses mais de mon côté je ne trouve pas beaucoup d'info sur la doc de Dr Memory..

    Edit : Ce que je ne comprends pas c'est que mes points d'arrêt se mettent toujours sur des SDL_FreeSurface qui fonctionnait très bien avant et auxquelles que je n'ai pas touchée mais par contre ce que j'ai rajouté ne provoque jamais de point d'arrêt..

    Edit2 : J'ai essayer d'utiliser visual leak detector (de Microsoft) mais j'ai directement cette erreur au démarrage :
    Le programme '[12980] Vaisseau.exe' s'est arrêté avec le code -1072365566 (0xc0150002).

  4. #4
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Je pense que tu fais tes FreeSurface alors que la SDL se sert du pointeur en question. Rajoute des mutex et ca devrait mieux se passer.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    C'est la première fois que j'utilise les mutex et j'ai essayer de mettre ceci en variable globale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_mutex* myMutex = SDL_CreateMutex();
    Mais j'ai l'erreur :
    error C2099: l'initialiseur n'est pas une constante

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Quand il s'agit de thread, je prefere eviter les globales. Je ferai plutot quelque chose dans ce genre a ta place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct ThreadData
    {
      pthread_mutex_t mutex;
      void *thread_data;
    } TreadData;
    Et je passerais cette structure en argument a tous mes threads. Comme ca, ton mutex pourra etre (ou non) commun a toutes tes donnees threadees si tu veux.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    Merci pour ta réponse, j'ai réussis à mettre des SDL_mutex autour des SDL_FreeSurface qui posaient problème et.. Après environ 5 minutes de jeux, j'ai eu cette fois-ci un point d'arrêt sur une ligne d'allocation de mémoire. C'est à dire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* gameOverImage = IMG_Load("IMAGES/gameOver.jpg"), *pointsSurface, *imageAsteroide, *lifeBar = IMG_Load("IMAGES/lifeBar.png"), *imageTextLife, *bombe = IMG_Load("IMAGES/bombe.png"), *carreBlanc, *iconBombe;
    J'ai pu faire continuer, et là certaines de mes images étaient "inversé" c'est à dire que par exemple au lieu d'avoir l'image d'une bombe j'avais mes points qui apparaissaient. Mais il n'a pas fallu longtemps avant que mon programme ne s'arrête de nouveau sur ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    asteroideRef = IMG_Load("IMAGES/asteroid.png");
    asteroideDetruitRef = SDL_LoadBMP("IMAGES/asteroideDetruit.bmp");
    SDL_SetColorKey(asteroideDetruitRef, SDL_SRCCOLORKEY, SDL_MapRGB(asteroideDetruitRef->format, 128, 5, 31));
    Et j'ai cette ligne qui se rajoute dans mes erreurs :
    HEAP[Vaisseau.exe]: HEAP: Free Heap block 02971F50 modified at 02971F84 after it was freed
    Alors je ne comprends vraiment plus rien, j'ai l'impression que mon programme fait des siennes..

  8. #8
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    La en gros t'as accede a une case memoire liberee et tu l'as modifie (toi ou la SDL). Il te manque encore des mutex.

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Avant de mettre des mutex de partout, je pense qu'il faut déjà s'interroger sur la pertinences des différents threads ainsi que de leur rôle exact.

    Un seul thread peut être beaucoup plus rapide que plein de threads avec des mutex de partout.

  10. #10
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut
    Hello,

    Citation Envoyé par Gurdile Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* gameOverImage = IMG_Load("IMAGES/gameOver.jpg"), *pointsSurface, *imageAsteroide, *lifeBar = IMG_Load("IMAGES/lifeBar.png"), *imageTextLife, *bombe = IMG_Load("IMAGES/bombe.png"), *carreBlanc, *iconBombe;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    asteroideRef = IMG_Load("IMAGES/asteroid.png");
    asteroideDetruitRef = SDL_LoadBMP("IMAGES/asteroideDetruit.bmp");
    SDL_SetColorKey(asteroideDetruitRef, SDL_SRCCOLORKEY, SDL_MapRGB(asteroideDetruitRef->format, 128, 5, 31));
    Tu es sous windows, dis-tu. Alors le / devrait être remplacé par \ (donc \\):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface* gameOverImage = IMG_Load("IMAGES\\gameOver.jpg");
    As-tu testé le retour de IMG_Load (=qu'il ne soit pas NULL) ?

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  11. #11
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par edgarjacobs Voir le message
    Tu es sous windows, dis-tu. Alors le / devrait être remplacé par \ (donc \\)
    Inutile, windows gere tres bien les paths qu'on lui fournit avec des '/' ou des '\'.

  12. #12
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 551
    Points
    1 551
    Par défaut
    Citation Envoyé par imperio Voir le message
    Inutile, windows gere tres bien les paths qu'on lui fournit avec des '/' ou des '\'.
    Et bien, je te remercie, je viens de tester ça (n'étant pas convaincu) et je viens donc d'apprendre quelque chose.

    Edgar.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  13. #13
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    J'ai appris exactement de la meme facon que toi haha.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 48
    Points : 35
    Points
    35
    Par défaut
    Encore merci à tous pour vos réponses !

    J'ai remodeler mon code en faisant en sorte d'avoir une thread de moins et j'ai placé quelques mutex, et maintenant je n'ai plus de problèmes de fuite de mémoire.

    Merci pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. GObject Critical error
    Par tails dans le forum SWT/JFace
    Réponses: 8
    Dernier message: 20/04/2011, 09h52
  2. phpBB : Critical Error . . . Suite changement MDP
    Par eva98 dans le forum Installation
    Réponses: 0
    Dernier message: 08/05/2008, 09h25
  3. [gtkmm] critical error emplacement
    Par drKzs dans le forum GTK+
    Réponses: 4
    Dernier message: 14/06/2007, 20h39
  4. [NASM] Critical error (code 5)
    Par fabnet dans le forum Assembleur
    Réponses: 11
    Dernier message: 25/03/2005, 19h51
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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