Premiers pas sous Unix

Introduction

Sous Unix, il est courant de réaliser les makefile à la main sans avoir recours à un environnement de développement.

Le développeur Windows se sent tout nu au début dans la mesure ou il doit réaliser manuellement tout ce que Visual Studio ou même Dev CPP (etc...) fait pour lui.

On peut noter que les environnements de développement (kdevelop, Eclipse, Anjuta) permettent de masquer tout cela.

Makefile

Un makefile a l'aspect suivant sous Unix (et sous Windows aussi d'ailleurs !!)

all: coucou

coucou: coucou.o
    gcc coucou.o -o coucou

# -c pour compiler, -g pour le mode debug
coucou.o: coucou.c
    gcc -c -g coucou.c -o coucou.o

On fera attention aux caractères spéciaux, en particulier les ^M (retours chariots) qui apparaîssent lorsque l'on récupère un texte tapé sous un éditeur Windows type notepad et qui posent des problèmes. On peut d'ailleurs les supprimer dans vi avec la commande suivante :

:1,$s/^M// (faire Control V Control M pour afficher le ^M)
=> De la ligne 1 à la fin, on remplace le Control M par rien

Ici, le but est de compiler le programme coucou.c suivant :

#include <stdio.h>

int main()
{
    printf( "coucou\n" );
    return 0;
}

Si on veut porter un programme sur un maximum de plateformes Unix, if faut tôt ou tard se plonger dans les arcanes d'autoconf (Eh oui, le C est portable, mais chaque Unix a ses propres spécificités comme des prototypes différents ou des API différentes etc...)

Débogage

Tout développeur qui se respecte se doit de savoir utiliser un débogueur. Le débogueur incontournable sous Unix est gdb. Pour que le programme puisse être débogué, il faut bien sur le compiler en débug avec -g.

Ci dessous, voici comment déboguer notre programme :

$ gdb coucou
(gdb) b main
(gdb) r
Breakpoint 1, main () at coucou.c:5
5           printf( "coucou\n" );
(gdb) n
coucou
6           return 0;
(gdb) 

Les commandes usuelles sont :

Pour déboguer un programme qui tourne déjà, on récupère son numéro de process avec ps comme suit :

ps -ef | grep coucou
ou (fonction de la version d'Unix (linux, freebsd, solaris ...)
ps -aux | grep coucou

puis pour le déboguer (par exemple 1830 est le numéro de processus) :

$gdb coucou 1830

Il existe un frontal graphique à gdb, ddd qui peut éviter d'avoir à mémoriser ces commandes. toutefois, lorsque seul un modem 56 K permet d'accèder à la machine à déboguer, gdb reste le meilleur choix.

Rechercher les trous de mémoire

Il faut utiliser sans hésiter valgrind. Voir quelques explications ici

Sources

Liens

Valid XHTML 1.0!