4. 4
En situation
• Programme syntaxiquement correct
MAIS
1. Programme avec un comportement aléatoire
2. Programme planté ?
Message Segmentation Fault
Fichier coredump (peut être très gros)
5. 5
Déboguer ?
• A la main
Afficher le nom des variables / valeurs
Macro DUMP
• Utiliser un débogueur…
gdb ou confrères
• Utiliser un éditeur de développement avec
débogueur intégré
Eclipse, Visual, Borland
• Programmes tiers
valgrind (erreurs de contexte + fuite mémoire)
6. 6
Avertissement
• L'affichage printf pour un programme est une
tache qu'il est possible/souhaitable de remettre à
plus tard
• Forcer l'affichage avec fflush(stdout);
for (i = 0; i >= 0; ++i)
{
printf("%d", i);
}
7. 7
Préalable
• Compiler tous les programmes avec l'option de
profilage –g
Attention cela ralentit la compilation et l'exécution
• Lancer gdb / ddd dans le répertoire où se
trouvent les sources
Plus facile
Informations sur les lignes à problème
8. 8
Invoquer gdb
• produit GNU au format texte
• "Surcouches" graphiques
xgdb
ddd
gdb executable
gdb executable fichier_core
gdb executable numero_processus
9. 9
Exécuter un programme
Raccourci : r
Quitter : quit ou q
run
run paramètres_ligne_commande
run 10 "2eme param"
[ddd] paramètres spécifiés dans un
menu
10. 10
Point-d'arrêt (1)
• Break point
• Arrêter le programme à un point donné
Idéalement avec le bogue présumé
• A une ligne donnée
• A chaque fois qu'une fonction est appelée
break fonction
break prog.c:115
Raccourci : b
[ddd] click
11. 11
Point-d'arrêt (2)
• Connaître les points d'arrêt
• Effacer des points d'arrêt
• Faire des points d'arrêts conditionnels
Arrêter le programme si une condition est
réunie
help break
help breakpoints
continue (raccourci c)
12. 12
Avancer dans l'exécution
• Exécute la commande courante et s'arrête
Affiche la prochaine commande
• Exécute la commande courante
Si la commande est une fonction, s'arrête au
début de cette fonction
step
next
13. 13
Afficher des variables/expressions
• Afficher la valeur d'une variable
Doit être accessible au moment de l'évaluation
• Afficher la valeur de toute expression
print i*i
p 3*i
print argv[argc-1]
print max(5, 10)
print i
print variable
[ddd] survol souris
14. 14
Pile d'appel de fonctions ?
• Quelle fonction s'exécute ?
• Par qui a-t'elle été appelée ?
#0 fonction_courante
#1 in fonction_appelante
#2 in fonction_appelante_2
where
15. 15
Contexte / Frame
• #n : numéro du contexte
#0 fonction_courante
#1 in fonction_appelante
frame 1
print i
Affiche la variable i de fonction_appelante
up (u)
down (d)
16. 16
Déboguer un programme en cours
• Par paresse ?
• Programme dont l'initialisation est trop longue …
1. Le programme se met en pause
2. Faire les manipulations
3. Quitter gdb = le programme continue
gdb programme processus_id
gdb prog 16354
17. 17
Fichier core/coredump (1)
• Obtenu au plantage d'un programme
• Le plantage n'est pas toujours facile à
reproduire
• Image mémoire d'un processus
• Pleins d'infos si options –g
Pile d'appels, contenu de variables, …
• Le fichier n'est PAS toujours fiable
il peut être corrompu si la mémoire l'est
18. 18
Fichier core/coredump (2)
• Donner les chemins des fichiers s'ils ne sont
pas dans le répertoire de lancement de gdb
• Toutes les commandes ne sont pas
disponibles
: commandes d'exécution (next)
: print, where, frame
gdb programme fichier_core
19. 19
Aller plus loin…
help (h)
help mot_clé
Exemples :
• Gérer des fichiers sources dans plusieurs répertoires : dir
• Lister des lignes de code : list ou l
Documentation officielle :
http://www.cs.utah.edu/dept/old/texinfo/gdb/gdb_toc.html
21. 21
X Windows System
• Système graphique d’affichage sous UNIX
X11
X
• Terminal texte α
• Gestion des événements asynchrone
22. 22
Xlib
• Bibliothèque de bas niveau
Orientée événements (X / Protocole X)
Pas orientée composants (widgets)
Principales fonctions/déclarations préfixées par X
• Base pour des bibliothèques de plus haut niveau
Intrinsics (Xt)
Motif
Qt
GTK
SDL
• Peu d’alternatives
23. 23
Un peu d’histoire
• 1980 : MIT – Projet ATHENA
• 1984 : Protocole X – Xlib
• 1987 : Réécriture de X11R1 + Intrinsics
• 1988 : fondation consortium X
Dernière version X11R6.3 en 1997
• 1992 : projet XFree86
• 1997 : fondation de the Open Group
• 1999 : projet X.org
• 2012 : sortie en X11R7.7
26. 26
Client X / Serveur X
• Deux processus distincts
• Communication grâce au protocole X
• Client X
Programme utilisateur qui exploite le serveur X
Soumets de requêtes d’affichage
Gère l’interaction avec l’utilisateur
• Serveur X
Gestion et contrôle des E/S
Gère un display (écran(s), souris, clavier)
• Inversion géographique par rapport au modèle
classique
27. 27
Protocole X
• Description de la communication entre le
client et le serveur X
• Gestion asynchrone des événements
Pas d’attente de synchronisation
Zones mémoire tampon
• Indépendant de l’architecture
Réseau TCP/IP
Inter Processus Communication
28. 28
Serveur X / Display
Carte graphique
Mémoire
Périphériques d’entrée sortie
Multi écrans ?
Multi écrans ?
Problématiques / portabilité
• Taille de l’écran
• Nombre de couleurs (profondeur)
29. 29
1 serveur X, 1 display, 1 écran
a110.isima.fr:0.0
1 serveur X, 1 display, 2 écrans
a110.isima.fr:0.0 et a110.isima.fr:0.1
Clients X
Serveur
Terminal
Terminal
Réseau
Protocole X
30. 30
Fenêtre
• Composant de base obligatoire
• Hiérarchie de fenêtres
Fenêtre racine root non modifiable
Client particulier : le gestionnaire
• Tous les événements/actions se font relativement
à une fenêtre
Une seule fenêtre reçoit les événements claviers
• Le client est responsable de l’affichage, pas le
serveur
Fenêtre pas affichée par défaut
31. 31
Evénements (1)
1. Entrées-sorties
Appui sur une touche (avoir le focus)
Clic de souris
2. Gestion des fenêtres
Affichage/rafraîchissement de fenêtre (Exposure)
Redimensionnement
Mise en icône
3. Changement de configuration
4. Communication entre clients
32. 32
Evénements (2)
• Relatifs à une fenêtre
Propagation dans la hiérarchie
Sélection et filtre
• Asynchrones
• Pour le client
boucle principale d’attente et de gestion
• Structures XEvent
33. 33
Quelques rappels de codage
0 0 0
0 1 1
1 0 1
1 1 1
0 0 0
0 1 0
1 0 0
1 1 1
0 0 0
0 1 1
1 0 1
1 1 0
OU
|
ET
&
OU EXCLUSIF
XOR
Mettre à 1 les bits
d’un masque en fonction de certains critères
Afficher deux fois un pixel l’efface
34. 34
Ecrire un programme
1. Déclarations & initialisations générales
2. Connexion au serveur X
3. Initialisations spécifiques X
• Créer les ressources
• Afficher la fenêtre
4. Boucle principale
• Réception & analyse des événements
5. Libération des ressources
35. 35
Inclusions des entêtes
• Entêtes spécifiques à adapter, au minimum
• Ne pas oublier de mettre l’option –lX11
à l’édition des liens
• Préciser les chemins
des bibliothèques –Lrépertoire
–L/usr/X11R6/lib par exemple
Des entêtes -Irépertoire
#include <X11/Xlib.h> /* ou */
#include <X11R6/Xlib.h>
/* et d’autres suivant l’utilité */
36. 36
Window root;
Window win;
Display * dpy;
int ecran;
unsigned int wpx,
bpx;
XEvent ev;
unsigned int mask;
Fenêtre racine
Fenêtre à créer
display
écran par défaut
couleur d’avant-plan
couleur de fond
événement
masque
Déclarations
37. 37
Connexion & informations
dpy = XOpenDisplay(0);
ecran = DefaultScreen(dpy);
root = DefaultRootWindow(dpy);
bpx = BlackPixel(dpy,ecran);
wpx = WhitePixel(dpy,ecran);
Macros de convenance : ne commencent pas par X
Ouverture de la connexion
Tester si NULL
Récupération d’informations
Couleurs utilisées par l’écran
38. 38
Créer une fenêtre
win = XCreateSimpleWindow( dpy,root,0,0,
LARGEUR,HAUTEUR,6,wpx,bpx);
XStoreName(dpy,win, "Titre fenêtre");
XSelectInput(dpy,win, ExposureMask );
XMapWindow(dpy,win);
Sélection des événements intéressants pour la fenêtre
Affichage de la fenêtre
41. 41
Libérer les ressources
• Détruire la fenêtre & fermer la connexion
• Rendre les ressources liées aux
Contextes graphiques
Polices de caractères
Curseurs souris
Pixmaps
…
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
XFreeGC(dpy, gcontext);
42. 42
Contexte graphique
• Toutes les informations pour une opération
graphique
• Dessin d’une forme
Épaisseur de trait
• Affichage de texte lié à une police de caractères
• Couleur d’avant plan
foreground color ou white pixel
• Couleur de fond
background color ou black color
43. 43
GC gcontext;
XGCValues gcv;
unsigned long gcmask;
gcv.foreground = wpx;
gcv.background = bpx;
gcv.line_width = 3;
gcv.function = GXcopy;
gcmask = GCForeground | GCBackground |
GCLineWidth | GCFunction;
gcontext =
XCreateGC(dpy,win,gcmask,&gcv);
Variables
Couleur et trait
Affichage des pixels
(remplacement, XOR…)
Masque pour champs renseignés précédemment
Création du contexte graphique
44. 44
Dessiner
• Dessin dans une boite (largeur, hauteur)
• XDrawLine
• XDrawRectangle
• XFillRectangle
• XDrawArc
• XFillArc
angles en 64èmes de degrés
(0,0)
y
x
Coin haut gauche
+ largeur
+ hauteur
45. 45
Dans les exemples fournis…
• Comment changer un curseur de souris
Sablier, pointeur, …
• Comment afficher une chaîne de caractères
Impossible avec un premier événement
• Saisir une chaîne de caractère
• Charger/libérer une police de caractères
46. 46
Gestion de la couleur
• Gestion compliquée lié à la disparité du
matériel et à l’âge des concepts
Frame buffer, plan de bits
Profondeur d’écran depth
• Exemples de visuels visual
Monochrome, niveau de gris
Mode direct color & true color (24 bits)
• Palette colormap
Niveaux de Rouge Vert Bleu
49. 49
Au delà du C …
• Concepts X réutilisés partout notamment la
programmation événementielle
• Notions
Affichage graphique
Portabilité
• Langages avec interfaces graphiques
quasi-natives
JAVA
C#
Visual C++
• Aller plus loin
http://pficheux.free.fr/articles/lmf/xlib/
http://tronche.com/gui/x/xlib/
51. 51
Arbres
• Structures arborescentes d'éléments
ordonnables
• Efficacité et rapidité des algorithmes
• Moins facile (parfois) à comprendre
• Insertion, suppression de nœuds
• Equilibrage des branches ?
68. 68
Copie de processus (1)
• Création d'un processus fils, copie conforme
du processus père
Même zone de données et de code
Même environnement
Même priorité
Même description de fichiers
• Exécution concurrente des deux processus
69. 69
Copie de processus (2)
Valeur de retour :
-1 : erreur lors de la création
limite du nombre de processus
0 : processus fils
>0 : processus père, pid du processus fils
Après un fork(), tout se passe comme si chacun
venait de faire un fork()
pid_t fork(); #include <unistd.h>
70. 70
Terminaison de processus
• Terminaison "normale"
Fin de la fonction main()
Fonction
• Valeur transmise au shell
Retour du main()
Paramètre d'exit()
void exit(int);
0 : fin normale
$ echo $? (shell [k]sh)
> print ERRORLEVEL (win)
71. 71
exit()
• Définie dans
• Sortie propre du programme
Tampons vidés
Fichiers fermés
• Libérer la mémoire allouée sur le tas
#include <stdlib.h>
ptr = malloc(…);
if (!ptr) exit(2);
73. 73
int i;
for (i = 0; i < 3; i++) fork();
Exemple 2
• Combien de processus sont créés ?
i=0 i=1
i=1
i=2
i=2
i=2
i=2
74. 74
Interface C / Système
• Faire un appel système
• Passer des paramètres (ligne de commande)
• Flux standards
int system(char *);
int main(int, char **);
system("ls –l");
system("date");
stdin : entrée standard <
stdout : sortie standard >
stderr : sortie d'erreur standard 2>
75. 75
Entrées/sorties de bas niveau
• Fonctions fichiers de haut niveau
Fonctions textes ou binaires
• Fonctions de bas niveau
Proches des primitives systèmes
Plus rapide / plus directe
Pas de formatage des données
Pas de mémoire tampon
Pas toujours portables
• Ne pas mélanger les deux types d'accès sur un même
fichier
76. 76
Descripteur de fichier
• Simple entier pour repérer un fichier
Equivalent de FILE des fonctions haut niveau
• Valeur réservée ou personnelle
• Nombre de fichiers ouverts simultanément limité
0 stdin
1 stdout
2 stdout
3 Fichier spécial E/S
4 Imprimante
77. Création / ouverture
• Création
Permission d'accès en octal
• Ouverture
77
int creat(char * nom, int permission);
int open(char * nom, int mode, int perm);
O_RDONLY Lecture seule
O_WRONLY Ecriture seule
O_RDWR Lecture/écriture
Fonctions et constantes
non standardisées
• fcntl.h (Sys V)
• sys/file.h (BSD)
79. Lecture/écriture/position
• Lecture
-1 en cas d'erreur, 0 pour EOF, n si tout va bien
• Ecriture
• Position
• PPP
79
int read(int fd, char * tampon, int n);
int write(int fd, char * tampon, int n)
long tell(int fd);
long lseek(int fd, long off, int or);
0 SEEK_SET Début fichier
1 SEEK_CUR Position courante
2 SEEK_END Fin de fichier
80. 80
int getchar(void) {
char c;
return (read(0, &c,1)==1?(int)c:EOF;
}
int getchar(void) {
static char tampon[BUFSIZE];
static char * ptamp = tampon;
static int n = 0;
if (!n) {
n = read (0, tampon, BUFSIZE);
ptamp = tampon;
}
return (--n>=0)?(int)*ptamp++:EOF;
}
Avec buffer
Sans buffer
Notes de l'éditeur
Calcul du nombre de tests pour trouver une valeur dans un arbre en comparaison d'une liste chainee meme triee
0 pour la permission de open si pas de création de fichier
0 pour la permission de open si pas de création de fichier
0 pour la permission de open si pas de création de fichier