gtk + se bloque lors de l'appel d'une fonction de dessin cairo


2

Désolé pour mon mauvais anglais.

J'apprends GTK + 3 comme "helloworld" en suivant cet article https://developer.gnome.org/gtk3/stable/gtk-getting-started.html

Mon environnement:
* Mac OS X 10.8.3
* XQuartz 2.7.4
* gtk + 3.4.4
* i686-pomme-darwin11-LLVM-gcc-4,2

Tout fonctionnait bien avant que j'essayé d'invoquer cette fonction en tant que gestionnaire de signal pour le dessin:

 
static gboolean configure_event_cb(GtkWidget* widget,GdkEventConfigure* event,gpointer data) 
{ 

    if(surface) cairo_surface_destroy(surface); 

    surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget), 
               CAIRO_CONTENT_COLOR, 
               gtk_widget_get_allocated_width(widget), 
               gtk_widget_get_allocated_height(widget)); 

    //非对象类型.看做普通的struct. cairo看做类似Graphics的静态类. 
    cairo_t* cr = cairo_create(surface); 

    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); 

    cairo_paint(cr); 

    cairo_destroy(cr); 

    return TRUE; 
} 

Le programme s'est toujours écrasé sur la ligne "cairo_paint (cr)" ou "cairo_fill" dans d'autres fonctions. Voici la callstack:

 
libcairo.2.dylib`_cairo_default_context_in_clip: 
0x100a71ff5: pushq %rbp 
0x100a71ff6: movq %rsp, %rbp 
0x100a71ff9: pushq %rbx 
0x100a71ffa: pushq %rax 
0x100a71ffb: movq %rsi, %rbx 
0x100a71ffe: movq 40(%rdi), %rdi 
0x100a72002: callq 0x100a761c1    ; _cairo_gstate_in_clip 
0x100a72007: movl %eax, (%rbx) 
0x100a72009: xorl %eax, %eax 
0x100a7200b: addq $8, %rsp 
0x100a7200f: popq %rbx 
0x100a72010: popq %rbp 
0x100a72011: ret  

Quelqu'un pourrait m'aider?

0

J'ai trouvé la réponse.

Le problème réel est que la bibliothèque Cairo n'a pas été chargée au moment de l'exécution. L'indice est que Xcode m'a montré la suite msg quand j'ai essayé de dessiner quelque chose avec caire:
Erreur: adresse ne contient pas de section qui pointe vers une section dans un fichier objet

Alors j'ai changé gcc commande en ajoutant -L/usr/-lcairo local/lib:

/usr/bin/gcc -Wall ./*.c -L/usr/local/lib -lcairo pkg-config --cflags --libs gtk+-3.0

Après avoir fait cela, il ne se bloque plus. Howerver, je ne sais pas quel type de bibliothèque est réellement lié à la bibliothèque exécutable, partagée ou statique? Et pourquoi n'a-t-il pas chargé cette bibliothèque à l'exécution?


1

Je suspecte une corruption de mémoire due à l'appel à cairo_surface_destroy. Où déclarez-vous surface? Où le placez-vous avant l'appel à cairo_surface_destroy? Êtes-vous sûr qu'il pointe vers un objet de surface valide avec le nombre de références> 0?

Je vais essayer de commenter cette ligne et voir si vous obtenez toujours les plantages. Vous aurez probablement des fuites de mémoire à corriger, mais au moins vous saurez si c'est le problème.

  0

Merci @gcbenison. J'ai déclaré que la surface var était statique globalement tout comme ce que faisait ce tutoriel. En fait, même si j'avais copié tout le code original dans ce tutoriel pour le test, il s'est écrasé aussi. La fonction destroy ne semble pas être un problème :-(. 16 mai. 132013-05-16 18:58:36