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 :

[opensuse 12.2 -- glibc 2.15-22.17.1 x86_64] ASSERTION failed in malloc


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut [opensuse 12.2 -- glibc 2.15-22.17.1 x86_64] ASSERTION failed in malloc
    Je suis en train de tenter, avec mes élèves, de faire une simulation de RPG (en mode texte/console sous Linux).

    J'ai ce message qui survient, j'expliquerais la manière de reproduire ce message:

    rpg2014: malloc.c:2451:
    sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||
    ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) &
    ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed
    Je peux vous fournir le code d'où cette "exception" (grrr ! pas moyen de l'intercepter comme en OO) est "lancée", mais ne vous mettez pas à rigoler de ma caisse car je "joue avec le feu" dans cette partie de code.
    Avant de commence cette fonction j'ai pourtant réfléchi, j'ai essayé plein d'approches différentes, et aucune à part celle-ci m'a permis d'avancer.

    Voici le concept: là aussi il y a matière à discuter mais bon...

    J'ai une carte (une map) de 228 colonnes sur 48 lignes.
    Notre plateau de jeu (affiché à l'écran) fait 80 colonnes sur 16 lignes.
    L'idée est de pouvoir copier les éléments du fichier comme si une fenêtre "glissait" sur la carte et ne dévoilait que 80 colonnes et 16 lignes à la fois.

    Ca fonctionne bien, j'en suis d'ailleurs très content, cependant, quand un obstacle se situe sur la dernière ligne d'une "fenêtre" et que le joueur cherche à changer de carte (sans "voir" l'obstacle de l'autre côté) il doit y avoir un avertissement indiquant qu'il ne peut pas changer de carte.

    Mon idée était de changer de "fenêtre" (je charge dans ce qui représente "la fenêtre" les éléments issue de la carte à la position hypothétique du joueur) et si il n'y avait pas d'obstacles alors je considérais que la "nouvelle fenêtre" peut être affichée.
    Dans le cas contraire, je restitue les données de "l'ancienne fenêtre".

    Ca fonctionne... même mieux que ce que j'imaginais...

    Cependant: si je ne suis pas en mode plein écran (???) et que je place mon joueur à un endroit à la limite supérieure d'une fenêtre où je sais que sur la "fenêtre du dessus" il y a des obstacles, et que je fais des essais successifs pour aller dans la direction des obstacles, au bout d'un moment j'obtiens ce message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    [1420625324.058053612][Wed Jan  7 11:08:44 2015]        --------------------------------------------------------------------------------------
    [1420625324.545795916][Wed Jan  7 11:08:44 2015]        Ligne 01 --> [000000000000000000000000000000000000000000000000000000000000000000000000M00000000000000F]
    [1420625324.545916732][Wed Jan  7 11:08:44 2015]        Ligne 02 --> [00000000000000000000000000000000000000000000000000000000000000000000M000M0000000000FFFFF]
    [1420625324.545963200][Wed Jan  7 11:08:44 2015]        Ligne 03 --> [00000000000000000EEEEEEE00000000000000000000000000000000000000000000MMMMM00000000000FFFF]
    [1420625324.546023852][Wed Jan  7 11:08:44 2015]        Ligne 04 --> [000000000000000000EEEEE000000000000000000000000000000000000000000000M000M0000000000FFFFF]
    [1420625324.546057113][Wed Jan  7 11:08:44 2015]        Ligne 05 --> [00000000000000000EEEEEEEEE000000000000000000000000000000000000000000M000000000000000000F]
    [1420625324.546089885][Wed Jan  7 11:08:44 2015]        Ligne 06 --> [0000000000000000000000EEE0000000000000000000000000000000000000000000M000M000000000000000]
    [1420625324.546122168][Wed Jan  7 11:08:44 2015]        Ligne 07 --> [00000000000000000000000000000000000000000000000000000000000000000000MMM0M000000000000000]
    [1420625324.546154451][Wed Jan  7 11:08:44 2015]        Ligne 08 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546187223][Wed Jan  7 11:08:44 2015]        Ligne 09 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546219016][Wed Jan  7 11:08:44 2015]        Ligne 10 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546251788][Wed Jan  7 11:08:44 2015]        Ligne 11 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546283582][Wed Jan  7 11:08:44 2015]        Ligne 12 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546315865][Wed Jan  7 11:08:44 2015]        Ligne 13 --> [000000000000000000000000000000000000000MMMMMMMMMM000000000000000000000000000000000000000]
    [1420625324.546348637][Wed Jan  7 11:08:44 2015]        Ligne 14 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000]
    [1420625324.546380920][Wed Jan  7 11:08:44 2015]        Ligne 15 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000]
    [1420625324.546413202][Wed Jan  7 11:08:44 2015]        Ligne 16 --> [000000000000000000000000000000000000000M00MMMMMMM000000000000000000000000000000000000000]
    [1420625324.546444018][Wed Jan  7 11:08:44 2015]        --------------------------------------------------------------------------------------
    [1420625324.546684182][Wed Jan  7 11:08:44 2015]        Ligne 01 --> [000000000000000000000000000000000000000M00000000M000000000000000000000000000000000000000]
    [1420625324.546739454][Wed Jan  7 11:08:44 2015]        Ligne 02 --> [000000000000000000000000000000000000000MMMMMMMM0M000000000000000000000000000000000000000]
    [1420625324.546772715][Wed Jan  7 11:08:44 2015]        Ligne 03 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546804998][Wed Jan  7 11:08:44 2015]        Ligne 04 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546837770][Wed Jan  7 11:08:44 2015]        Ligne 05 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546870542][Wed Jan  7 11:08:44 2015]        Ligne 06 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.546903314][Wed Jan  7 11:08:44 2015]        Ligne 07 --> [000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000000]
    [1420625324.546936086][Wed Jan  7 11:08:44 2015]        Ligne 08 --> [0000000000000000000000000000000000000EEEEEEE00000000000000000000000000000000000000000000]
    [1420625324.546968368][Wed Jan  7 11:08:44 2015]        Ligne 09 --> [0000000000000000000000000000000000EEEEEEE00EEEEEEE00000000000000000000000000000000000000]
    [1420625324.547001140][Wed Jan  7 11:08:44 2015]        Ligne 10 --> [0000000000000000000000000000000EEEEEEE00000000EEEEEEE00000000000000000000000000000000000]
    [1420625324.547033912][Wed Jan  7 11:08:44 2015]        Ligne 11 --> [000000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000]
    [1420625324.547066195][Wed Jan  7 11:08:44 2015]        Ligne 12 --> [000000000000000000000000000000000EEEEEEE000000000000000000000000000000000000000000000000]
    [1420625324.547098967][Wed Jan  7 11:08:44 2015]        Ligne 13 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.547145924][Wed Jan  7 11:08:44 2015]        Ligne 14 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.547178696][Wed Jan  7 11:08:44 2015]        Ligne 15 --> [0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]
    [1420625324.547211468][Wed Jan  7 11:08:44 2015]        Ligne 16 --> [VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV]
    [1420625324.547242283][Wed Jan  7 11:08:44 2015]        --------------------------------------------------------------------------------------
    [1420625325.110275422][Wed Jan  7 11:08:45 2015]        Ligne 01 --> [000000000000000000000000000000000000000000000000000000000000000000000000M00000000000000F]
    [1420625325.110391346][Wed Jan  7 11:08:45 2015]        Ligne 02 --> [00000000000000000000000000000000000000000000000000000000000000000000M000M0000000000FFFFF]
    [1420625325.110426075][Wed Jan  7 11:08:45 2015]        Ligne 03 --> [00000000000000000EEEEEEE00000000000000000000000000000000000000000000MMMMM00000000000FFFF]
    [1420625325.110458358][Wed Jan  7 11:08:45 2015]        Ligne 04 --> [000000000000000000EEEEE000000000000000000000000000000000000000000000M000M0000000000FFFFF]
    [1420625325.110516075][Wed Jan  7 11:08:45 2015]        Ligne 05 --> [00000000000000000EEEEEEEEE000000000000000000000000000000000000000000M000000000000000000F]
    Ca ne vous parlera peut-être pas...
    Ci-dessus vous avez le log de ce qu'il se passe dans le code de la fonction qui me pose soucis...

    Le joueur se trouve en-dessous des 'M' de la ligne 16.
    Si je vais dans la direction du Nord (UP au clavier) mon programme ne change pas de "fenêtre" mais dans ma fonction, la "fenêtre" qui devrait être affichée si il n'y avait pas d'obstacle est bien chargée en mémoire... ceci pour vérifier qu'il n'y a pas d'obstacles à la progression
    du joueur justement.
    La fonction ne "se plante" pas de suite, si on ne fait qu'un seul essai, le programme continue de fonctionner normalement, par contre si je fais deux ou trois essais successifs, au bout d'un moment la fonction se plante au niveau de la fonction malloc() qui est utilisée...
    Dans le log, dans ce cas-ci c'est quand on passe à la sixième ligne, mais cela dépend de la taille de la fenêtre de la console... c'est vraiment aléatoire, en mode plein écran cela n'arrive pas.
    Je laisse mon doigt appuyé sur la touche "UP" du clavier et la fonction setWindow() ne se "plante" jamais (????)

    Je pense, mais je n'en sais rien du tout, que le "switch trop rapide" entre la "fenêtre du dessous" et la "fenêtre du dessus" serait la source du "plantage" de malloc().
    Cependant, je n'arrive pas à expliquer pourquoi en mode plein écran je n'arrive pas à reproduire les symptômes... pourtant la taille de la "fenêtre" est plus importante, il y a plus de données à manipuler.

    Voici l'extrait (de l'horreur) de la fonction d'où provient le soucis...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    void setWindow(t_Map *LaCarte,t_WindowMap *target,int posXCourante,int posYCourante)
    {
    	// ***********************************************************************************************************************************************************
    	// setWindow est utilisée par plusieurs processus (thread d'affichage, thread de gestion clavier, thread des ennemis) 
    	// il se peut qu'il y ait une "race condition" --> section critique pour chaque appel de cette fonction dans chacun des threads...
    	// ***********************************************************************************************************************************************************
     
    	#define LOGON
     
    	#ifdef LOGON
    	char	Debug[target->Colonnes*2];
    	FILE	*ptrDebug;
    	#endif
     
    	int		cpt;
    	int		LignesCarte;
    	char	tmpTab[target->Lignes][target->Colonnes+1];
     
    	target->status=false;
     
    	#ifdef LOGON
    	ptrDebug=fopen("logs/setWindowdebug.log","a+t");
    	if(ptrDebug!=NULL)
    	{
    	#endif
    		if(posYCourante>LaCarte->m_max_Y || posXCourante>LaCarte->m_max_X)
    		{
    			//Log(ptrDebug,"Hors des limites !!");
    			target->m_ptr=NULL;
    			return;
    		}
     
    		//sprintf(Debug,"Position courante (%02d,%02d)",posXCourante,posYCourante);
    		//Log(ptrDebug,Debug);
     
    		if(LaCarte->m_ptr!=NULL)
    		{
    			for(cpt=0,LignesCarte=posYCourante;cpt<target->Lignes && LignesCarte<LaCarte->m_max_Y;cpt++,LignesCarte++)
    			{
    				memset(tmpTab[cpt],0,target->Colonnes+1);
    				strncpy(tmpTab[cpt],*((LaCarte->m_ptr)+LignesCarte)+posXCourante,target->Colonnes+1);
     
    				tmpTab[cpt][target->Colonnes+1]='\0';
     
    				*((target->m_ptr)+cpt)=(char*)malloc(sizeof(char)*target->Colonnes+1);
    				memset(*((target->m_ptr)+cpt),0,sizeof(char)*target->Colonnes+1);
    				strcpy(*((target->m_ptr)+cpt),tmpTab[cpt]);
    #ifdef LOGON
    				sprintf(Debug,"Ligne %02d --> [%s]",cpt+1,*((target->m_ptr)+cpt));
    				Log(ptrDebug,Debug);
    #endif
    			}
    			if(cpt<target->Lignes)
    			{
    				for(LignesCarte=target->Lignes-1;LignesCarte>=cpt;LignesCarte--)
    				{	
    					memset(tmpTab[LignesCarte],0,target->Colonnes+1);
    					tmpTab[LignesCarte][target->Colonnes+1]='\0';
    					*((target->m_ptr)+LignesCarte)=(char*)malloc(sizeof(char)*target->Colonnes+1);
    					memset(*((target->m_ptr)+LignesCarte),0,sizeof(char)*target->Colonnes+1);
    					strcpy(*((target->m_ptr)+LignesCarte),tmpTab[LignesCarte]);
    				}
    			}
    		}
    	#ifdef LOGON
    	}
     
     
    	//target->Lignes=cpt;
     
    	memset(Debug,'-',target->Colonnes-1);
    	Debug[target->Colonnes-1]='\0';
    	Log(ptrDebug,Debug);
    	fflush(ptrDebug);
     
    	// éviter que la taille du fichier ne soit trop importante (c'est bien de débugger mais il faut pas que ça plante tout non plus... sur Linux aucun soucis, mais sur Windows...)
     
    	long taille;
     
    	fseek(ptrDebug,0L,SEEK_END);
    	taille=ftell(ptrDebug);
     
    	if(taille/1024L>1024L)
    	{
    		fclose(ptrDebug);
    		remove("logs/setWindowdebug.log");
    	}
    	else
    		fclose(ptrDebug);
    	#endif
    	target->status=true;
    }

  2. #2
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut
    Voici les définitions de types qui sont utilisés dans la fonction setWindow():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /*
     * s_WindowMap
     * 
     * Colonnes --> nombre de colonnes maximum affichables dans la "résolution" actuelle
     * Lignes --> nombre de lignes maximum affichables dans la "résolution" actuelle
     */
     
    typedef struct s_WindowMap
    {
      bool status;
     
    	int Colonnes;
    	int Lignes;
     
    	char **m_ptr;  // tableau de chaines de caractères
    }t_WindowMap;
     
     
    /*
     * s_Map
     * 
     * status --> indique si la carte est valide ou pas...
     * 
     * m_max_X --> nombre de colonnes maximum de la carte
     * m_max_Y --> nombre de lignes maximum de la carte
     * 
     * m_current_x --> position en X actuelle (fenêtrage)
     * m_current-y --> position en Y actuelle 
     * 
     */
     
    typedef struct s_Map
    {
      bool status;
    	int m_max_X;
    	int m_max_Y;
     
      int m_current_x;
      int m_current_y;
     
    	char **m_ptr;  // tableau de chaines de caractères
    }t_Map;

Discussions similaires

  1. Erreur avec Glibc en compilation croisée
    Par Senaku-seishin dans le forum Linux
    Réponses: 2
    Dernier message: 02/12/2005, 14h12
  2. Réponses: 5
    Dernier message: 04/11/2005, 18h59
  3. Installation glibc (glibc6) 2.3.2
    Par devmat dans le forum Debian
    Réponses: 9
    Dernier message: 03/04/2005, 15h31
  4. [REDHAT] Version glibc
    Par Estats dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/12/2004, 09h09
  5. Glibc endommagé, le restaurer ?
    Par Michaël dans le forum Mandriva / Mageia
    Réponses: 4
    Dernier message: 03/08/2004, 10h32

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