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+ Discussion :

Segfault ou Gtk-Critical (Au hasard)


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Par défaut Segfault ou Gtk-Critical (Au hasard)
    Bonjour, je rencontre un soucis dans le développement de mon code en C/GTK+
    Quelques jours que je suis dessus sans trouver la solution.
    Je poste dans le forum Gtk+ car quelques indices me laissent à penser que cela vient de ça même si je n'en suis pas forcément sur.
    En fait mon code va, soit planter avec une segfault. Dans ce cas la, le backtrace de gdb ou valgrind ne m'est vraiment pas d'une très grande utilité car il ne m'indique raucun endroit de mon code :
    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
    La sortie de valgrind avec : --track-origins=yes
    ==6968== Invalid read of size 4
    ==6968==    at 0x5119151: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0x513BCAC: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0x6AF3244: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B04F6B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D777: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D9DE: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x4FCD20B: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0xE424DBF: ffi_call_unix64 (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.2)
    ==6968==    by 0xE424827: ffi_call (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.2)
    ==6968==    by 0x6AF3EBB: g_cclosure_marshal_generic_va (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6AF3473: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D086: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==6968== 
    ==6968== 
    ==6968== Process terminating with default action of signal 11 (SIGSEGV)
    ==6968==  Access not within mapped region at address 0x0
    ==6968==    at 0x5119151: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0x513BCAC: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0x6AF3244: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B04F6B: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D777: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D9DE: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x4FCD20B: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-3.so.0.1400.5)
    ==6968==    by 0xE424DBF: ffi_call_unix64 (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.2)
    ==6968==    by 0xE424827: ffi_call (in /usr/lib/x86_64-linux-gnu/libffi.so.6.0.2)
    ==6968==    by 0x6AF3EBB: g_cclosure_marshal_generic_va (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6AF3473: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    ==6968==    by 0x6B0D086: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.1)
    Lorsqu'il ne segfault pas, j'ai droit à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    (siril:11890): Gtk-CRITICAL **: _gtk_rbtree_reorder: assertion 'tree->root->count == length' failed
     
    (siril:11890): Gtk-CRITICAL **: _gtk_rbtree_reorder: assertion 'tree->root->count == length' failed
     
    (siril:11890): Gtk-CRITICAL **: _gtk_rbtree_reorder: assertion 'tree->root->count == length' failed
     
    (siril:11890): Gtk-CRITICAL **: _gtk_rbtree_reorder: assertion 'tree->root->count == length' failed
     
    (siril:11890): Gtk-CRITICAL **: _gtk_rbtree_reorder: assertion 'tree->root->count == length' failed
     
    (siril:11890): Gtk-CRITICAL **: gtk_tree_view_unref_tree_helper: assertion 'node != NULL' failed
    Effectivement j'utilise un gtk_tree_vew qui liste des fichiers images. En le parcourant je créé de nouveau fichier et le plantage/warning apparrait lorsque j'écrase des fichiers existant portant le même nom.
    J'ai tenté un break g_log dans gdb mais cela me retourne le même genre de backtrace que dans valgrind.
    Bref, je suis un peu perdu et je sais pas du tout ou regarder.

    Pour lister les fichiers, j'utilise une GSList de la sorte :
    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
    	static GtkTreeView *tree_convert = NULL;
    	GtkTreeModel *model = NULL;
    	GtkTreeIter iter;
    	gboolean valid;
    	gchar *file_data;
    	GList *list = NULL;
    	int count = 0;
     
    	if (tree_convert == NULL)
    		tree_convert = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview_convert"));
     
            [...]
     
    	model = gtk_tree_view_get_model(tree_convert);
    	valid = gtk_tree_model_get_iter_first(model, &iter);
    	if (valid == FALSE) return;	//The tree is empty
     
    	while (valid) {
    		gtk_tree_model_get (model, &iter, 0, &file_data, -1);	// 0 for FILECOLUMN
    		list = g_list_append (list, file_data);
    		valid = gtk_tree_model_iter_next (model, &iter);
    		count ++;
    	}
            [...]
    Si quelqu'un avait une idée du pourquoi et du comment, ça serait génial.

    Bonne soirée,
    Cordialement

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Bonsoir.

    file_data est de quel type ?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Par défaut
    Ah oups j'ai oublié de le mettre dans le post, il est de type gchar.


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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 315
    Billets dans le blog
    5
    Par défaut
    Lorsque tu insères ce pointeur dans la GSList es-tu sûr par la suite que chaque pointeur pointe toujours sur un espace réservé ? Pour ma part je pense qu'il faudrait faire une copie de chaque file_data avec un malloc(); et d'insérer celle-ci dans la liste.

    Bien entendu cela implique une fonction qui libère tous ces malloc(); lorsque tu désires détruire la liste.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Par défaut
    Hum, je suis désolé mais je ne suis pas sûr de comprendre.

    Tu voudrais qu'avant le
    j'alloue de la mémoire a file_data ? en faisant un tableau de file_data ? (dans ce cas je perds l'avantage a faire une liste si je dois prévoir un tableau de char*)
    Car sinon, effectivement "file_data" est écrasé a chaque boucle, et je pensais que la valeur était copié lors du g_list_append.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 114
    Par défaut
    Si j'écris ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	while (valid) {
    		gtk_tree_model_get (model, &iter, 0, &file_data, -1);	// 0 for FILECOLUMN
    		char *str = strdup(file_data);
    		list = g_list_append (list, str);
    		valid = gtk_tree_model_iter_next (model, &iter);
    		count ++;
    	}
    sans me préoccuper des free dans un premier temps et j'ai toujours ma segfault.

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

Discussions similaires

  1. Gtk-CRITICAL **: gtk_text_buffer_emit_insert:
    Par cassignol dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 20/07/2009, 10h57
  2. erreur gtk critical
    Par muskachew dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 27/06/2009, 09h46
  3. (<unknown>:7854): Gtk-CRITICAL etc (Swing)
    Par rXpCH dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/10/2008, 14h59
  4. Problème de debuggage : Gtk-CRITICAL
    Par thibane dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 20/03/2007, 17h54
  5. Segfault sous gtk
    Par poxigua dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 01/12/2006, 12h29

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