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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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
    Membre averti
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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
    Membre averti
    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
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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.

+ 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