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

GTK+ avec C & C++ Discussion :

Windows / GLib-ERROR : Failed to allocate X bytes


Sujet :

GTK+ avec C & C++

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Windows / GLib-ERROR : Failed to allocate X bytes
    Bonjours a tous,

    C'est mon premier post sur ce forum, alors je vais tacher de poser mon
    probleme de facon a etre bien clair.
    Voici un mois que je developpe une application en C avec la librairie GTK,
    mais depuis peu, je n'arrive pas a me defaire d'une erreur.

    Quand survient-elle ?
    Mon erreur survient tot ou tard lorsque je manipule mon programme.

    Mon erreur :
    Une fenetre apparait m'indiquant ceci :
    "GLib-ERROR **: gmem.c:175: failed to allocate XXX bytes aborting..."
    (XXX : 4096 <--> 32)

    Nuances :
    J'ai constate que le nombre de bytes 'XXX' etait variable.
    En effet, lorsque mon programme demarre, je malloc differents pointeurs sur
    structure. Et suivant la taille de ces differents malloc, j'obtiens differentes
    valeur allant de 4096 a 32 bytes au moment ou survient l'erreur.
    Neanmois, l'espace memoire requis pour ces pointeurs ne depasse pas 2Ko.

    Mon analyse :
    Apparement, mon programme se termine car a un moment donne, il n'y a
    pas assez d'espace memoire suffisant pour pouvoir continuer.
    Peut etre que mon programme est trop gourmand ?
    Non, car pour fonctionner, l'espace totale alloue pour tous mes pointeurs
    ne depasse pas 2Ko, et il me reste en general, 1400Mo de RAM disponible.
    Peut etre est-ce mes barrettes de RAM qui sont deffectueuses ?
    J'effectuerai des test ce soir pour savoir ce qu'il en est...

    Un truc bizzar :
    Parfois le message d'erreur apparait avant meme que la fenetre principale
    puisse etre affichee. Mais, si dans ce cas la, je relance mon programme
    en mode debug, l'erreur survient plus tard dans l'execution, et permet
    ainsi l'affichage de ma fenetre principale. (alors qu'en mode normale ca
    "bloque" avant).

    Mes questions :
    Est-ce que lors de l'execution de mon programme, l'espace disponible pour
    celui-ci est un "bloc", de plus fixe ?
    Ainsi est-ce que mon programme peut-il est "bride" en memoire vive ?

    Merci d'avance pour vos reponse, car ce probleme me depasse!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Si t'étais sous linux, valgrind t'en dirait beaucoup plus sur l'origine du problème :-/ Sous windows, je ne sais pas trop comment mener l'enquête de façon efficace.

  3. #3
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci a toi pour l'astuce.

    C'est sur que d'adapter mon programme pour pouvoir le compiler sous linux
    serait une solution.
    Enfin bon, ca prendrait pas mal de temps donc j'attends de voir s'il
    n'y aurait pas une autre solution pour debug tout cela.

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Malheureusement je n'ai jamais réussi à trouver d'équivalent à Valgrind sous Windows.

    Sur le net, on peux trouver :


    Je me suis amusé à créer une sur-couche à malloc & co pour pister les allocations : SMA (Sources). Par contre il faut remplacer tous les appels à malloc par sma_malloc (idem pour calloc, realloc et free) ou définir des macro pour faire le travail à ta place.

    Mais pour commencer, tu peux essayer d'utiliser un débugger qui est généralement plus sensible à ce genre de problèmes

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut,

    Je code sous dev-c++ et je trouve le debugger pas tres comprehensible.
    Il m'aide parfois mais la il reste muet sur mon probleme, il indique rien du tout,
    meme lorsque l'erreur survient.

    Et puis il m'indique plein de chose anormale du coup je ne lui fait plus trop
    confiance. Du style, il m'indique que mon programme lit dans un espace memoire
    qui ne lui est pas alloue, quand mon programme retourne juste 0...
    Donc si un expert du debugger de dev-c++ passe par ici, qu'il se fasse connaite !

    Mais je pense quand meme que le probleme provient de la Glib. Je ne dis pas
    qu'elle est bugge, mais je pense que ca foire a un moment ou elle a besoin
    d'alloue de l'espace memoire. Du coup, je ne peux pas verifier tout ca,
    car ca me dit pas trop de toucher au code de la lib, car elle utilise ses
    propres fonctions pour allouer/liberer de l'espace en memoire,
    et puis je ne la connait pas plus que ca.
    Je me suis penche sur le sujet qu'hier soir, histoire de me sortir un peu de l'ignorance.

    Mais sinon, j'imagine que si ca foire quelque part autre que dans mes lignes
    de codes, c'est parce que je fais de la merde avec GTK ?
    J'ai commence a avoir ce probleme lorsque j'ai compile la fonction ci-dessous
    que je vais d'abord decrire.

    Mon programme, liste des resultats de requete SQL. Ainsi, j'affiche sous forme
    d'un label, le nombre de resultats trouves. Ce que je cherche a faire, c'est
    d'actualiser ce label lorsque je supprime une entree dans la liste de resultat.

    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
    // Le label en question, c'est la macro "TARGET"
     
    void     update_label_nb_res(t_result *result, int diff)
    {
        int       nb_res;
        char     *new_txt;
        gchar    *new_lab;
     
        nb_res = result->nb_res - diff;
        new_txt = my_calloc(30);
        sprintf(new_txt, "<span size=\"10\"><u><tt>%d Resultat%c</tt></u></span>",
                         nb_res, (nb_res > 1 ? 's' : ' '));
        new_lab = my_utf8(new_txt);
        gtk_label_set_text(GTK_LABEL(TARGET), new_lab);
        gtk_widget_show(result->label_nb_res);
        free(new_txt);
    }

  6. #6
    Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    J'ai resolu mon probleme, je n'ai plus de message d'erreur.
    Dans le code que j'ai donne precedement, mon my_calloc etait trop petit
    pour pouvoir stocker la chaine former avec sprintf...
    Bref tout ca pour un calloc trop petit, ca merite bien un petit...

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    utilises g_strdup_printf(); issue de la Glib. tu vas gagner du temps et surtout l'élimination de ce genre de problème.

  8. #8
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Effectivement, dans ce genre de cas g_strdup_printf est la meilleure solution... Et n'utilise jamais sprintf, mais snprintf.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/11/2010, 18h49
  2. Réponses: 3
    Dernier message: 08/12/2009, 14h14
  3. Error failed to initialize properly(0xc0150002)
    Par steph496 dans le forum C++
    Réponses: 3
    Dernier message: 04/05/2009, 16h19
  4. Programmation Windows Mobile, LoadLibrary failed
    Par ledanque dans le forum C++
    Réponses: 9
    Dernier message: 14/04/2009, 11h06

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