Deboguer les erreurs

/* erreur.c */

/* programme a de-boguer */

#include <stdio.h>
#include <X11/Xlib.h>

GC      gc; 
Display *display; 
int     screen; 
Window  win, wim, root; 
unsigned long white_pixel, black_pixel; 

main() {
  if ((display = XOpenDisplay ("")) == NULL) { 
    fprintf (stderr, "Can't open Display\n"); 
    exit (1); 
  } 
  gc = DefaultGC (display, screen); 
  screen = DefaultScreen (display); 
  root = RootWindow (display, screen); 
  white_pixel = WhitePixel (display, screen); 
  black_pixel = BlackPixel (display, screen); 
  win = XCreateSimpleWindow (display, root,  
			     0, 0, 200, 150, 2, black_pixel, white_pixel); 
  XSelectInput (display, win, ExposureMask | ButtonPressMask); 
  XStoreName (display, win, "erreur"); 
  XMapWindow (display, win); 
 
  for (;;) { 
    XEvent ev; 
    XNextEvent (display, &ev); 
    switch (ev.type) { 
    case Expose :             
      XDrawString (display, win, gc, 10, 30, "coucou !", 8); 
      break; 
    case ButtonPress :
      if( (ev.xbutton.x + ev.xbutton.y)%2 == 0) {
	XDrawString (display, win, gc, ev.xbutton.x, ev.xbutton.y, "ici", 3);
	XDrawString (display, win, gc, ev.xbutton.x +30, ev.xbutton.y, "la",2);
      } else {
	XDrawString (display, win, gc, ev.xbutton.x, ev.xbutton.y, "ici", 3);
	XDrawString (display, wim, gc, ev.xbutton.x +30, ev.xbutton.y, "la",2);
      };
      break;
    default : 
      break;            
    } 
  } 
}

Exécution :

cliquez dans la fenêtre jusqu'à ce que se produise l'erreur. Regardez le diagnostic d'erreur.

Fonctionnement de ce programme :

Le serveur envoie un événement-anomalie indiquant qu'une erreur est survenue. Le message sera reçu bien après la détection de l'erreur du fait de la communication asynchrone. Par défaut, le traitement d'une erreur associé à l'événement-anomalie est l'affichage sur stderr des informations (particulièrement les ressources en cause), puis la terminaison du programme. Il est possible d'associer un autre traitement, notamment qui poursuit l'exécution.

Exercice debogue.c :

Copiez le programme ci-dessus. Ajouter XSynchronize et des instructions traçantes write(1, "indication", 10), pour détecter le moment de l'erreur, et donc l'instruction erronée.
XSynchronize (display, bool)
int bool;
si bool = 1, passage en mode synchrone (très lent), sinon bool = 0 pour le mode asynchrone. En synchrone, elle force le vidage du tampon de requêtes, et fait attendre le client chaque terminaison de requête.

programme suivant index général fonctions de la XLib événements types dans XLib