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