Table des matières
Je donne quelques indications pour apprendre à programmer sous le système Debian, suffisantes pour suivre le code source mis en paquets. Voici les paquets importants correspondant aux paquets de documentation pour la programmations :
Tableau 12.1. Liste de paquets pour aider à la programmation
paquet | popcon | taille | documentation |
---|---|---|---|
autoconf
|
V:28, I:222 | 1896 |
« info autoconf » fourni par
autoconf-doc
|
automake
|
V:25, I:207 | 1693 1662 |
« info automake » fourni par
automake1.10-doc
|
bash
|
V:860, I:999 | 3942 |
« info bash » fourni par
bash-doc
|
bison
|
V:16, I:134 | 2047 |
« info bison » fourni par
bison-doc
|
cpp
|
V:427, I:858 | 64 |
« info cpp » fourni par
cpp-doc
|
ddd
|
V:2, I:24 | 3628 |
« info ddd » fourni par
ddd-doc
|
exuberant-ctags
|
V:8, I:48 | 286 | exuberant-ctags(1) |
flex
|
V:16, I:127 | 922 |
« info flex » fourni par
flex-doc
|
gawk
|
V:274, I:316 | 2269 |
« info gawk » fourni par
gawk-doc
|
gcc
|
V:207, I:668 | 41 |
« info gcc » fourni par
gcc-doc
|
gdb
|
V:35, I:176 | 5899 |
« info gdb » fourni par
gdb-doc
|
gettext
|
V:59, I:361 | 6094 |
« info gettext » fourni par
gettext-doc
|
gfortran
|
V:10, I:66 | 33 |
« info gfortran » fourni par
gfortran-doc (Fortran 95)
|
fpc
|
I:5 | 40 | fpc(1)
et les pages html fournies par fp-doc (Pascal)
|
glade
|
V:2, I:22 | 1836 | l’aide fournie par le menu (UI Builder) |
libc6
|
V:916, I:998 | 10164 |
« info libc » fourni par
glibc-doc et glibc-doc-reference
|
make
|
V:203, I:675 | 1145 |
« info make » fourni par
make-doc
|
xutils-dev
|
V:4, I:44 | 1432 | imake(1), xmkmf(1), etc. |
mawk
|
V:582, I:997 | 198 | mawk(1) |
perl
|
V:747, I:994 | 16809 | perl(1)
et les pages html fournies par perl-doc et
perl-doc-html
|
python
|
V:704, I:985 | 666 | python(1)
et les pages html fournies par python-doc |
tcl8.4
|
V:34, I:295 | 2897 | tcl(3)
et les pages de manuel détaillées fournies par tcl8.4-doc |
tk8.4
|
V:17, I:185 | 2411 | tk(3)
et les pages de manuel détaillées fournies par tk8.4-doc |
ruby
|
V:58, I:246 | 31 | ruby(1)
et la référence interactive fournir par ri |
vim
|
V:150, I:378 | 2006 |
menu d’aide (F1) fourni par vim-doc
|
susv2
|
I:0 | 48 | rechercher « The Single UNIX Specifications v2 » |
susv3
|
I:0 | 48 | rechercher « The Single UNIX Specifications v3 » |
Une référence en ligne est accessible en entrant « man
name
» après l’installation des paquets
manpages
et manpages-dev
. Les
références en ligne des outils GNU tools sont disponibles en entrant
« info nom_programme
» après l’installation des
paquets de documentation pertinents. Vous devrez peut-être inclure les
archives contrib
et non-free
en plus
de l’archive main
car certaines documentations GFDL ne
sont pas considérées comme conformes à DFSG.
![]() |
Avertissement |
---|---|
N’utilisez pas « |
![]() |
Attention |
---|---|
Vous devrez installer les programmes directement compilés à partir des
sources dans « |
![]() |
Astuce |
---|---|
Les exemples de code pour la création de « Song 99 Bottles of Beer » devraient vous donner de bonnes indications sur pratiquement tous les langages de programmation. |
Le script de l’interpréteur de commandes (« shell script » est un fichier texte dont le bit d’exécution est positionné et qui contient des commandes dans le format suivant :
#!/bin/sh ... lignes de commandes
La première ligne indique l’interpréteur qui sera utilisé pour lire et exécuter le contenu de ce fichier.
La lecture des scripts de l’interpréteur de commandes est la meilleure manière de comprendre comment fonctionne un système de type UNIX. Je donne ici quelques indications et rappels de la programmation avec l’interpréteur de commandes. Consultez « Erreurs en shell » (http://www.greenend.org.uk/rjk/2001/04/shell.html) pour apprendre à partir d’erreurs.
Contrairement à l’interpréteur de commandes en mode interactif (consultez Section 1.5, « La commande simple de l’interpréteur de commandes » et Section 1.6, « Traitement des données textuelles à la UNIX »), les scripts de l’interpréteur de commandes utilisent souvent des paramètres, des conditions et des boucles.
De nombreux scripts systèmes peuvent être interprétés par n’importe lequel
des interpréteurs de commande POSIX (consultez
Tableau 1.13, « Liste d’interpréteurs de commandes (« shells ») »). L’interpréteur de commandes par
défaut pour le système est « /bin/sh
» qui est
un lien symbolique pointant vers le programme réel.
bash(1)
pour lenny
ou plus ancien
dash(1)
pour squeeze
ou plus récent
Évitez d’écrire des scripts de l’interpréteur de commandes avec des bashismes ou des zshismes afin de les rendre portables entre tous les interpréteurs POSIX. Vous pouvez le vérifier en utilisant checkbashisms(1).
Tableau 12.2. Liste de bashismes typiques
Bon : POSIX | À éviter : bashisme |
---|---|
if [ "$toto" = "$titi" ] ; then …
|
if [ "$toto" == "$titi" ] ; then …
|
diff -u fichier.c.orig fichier.c
|
diff -u fichier.c{.orig,}
|
mkdir /tototiti /tototutu
|
mkdir /toto{titi,tutu}
|
funcname() { … }
|
function funcname() { … }
|
format octal : « \377 »
|
format hexadécimal : « \xff »
|
La commande « echo
» doit être utilisée avec
les précautions suivantes car son implémentation diffère selon que l’on
utilise les commandes internes ou externes de l’interpréteur de
commandes :
Éviter l’utilisation des options de commande
« -e
» et « -E
».
Éviter d’utiliser toutes les options de commandes sauf
« -n
».
Éviter d’utiliser les séquences d’échappement dans les chaînes de caractères car leur prise en compte varie.
![]() |
Note |
---|---|
Bien que l’option « |
![]() |
Astuce |
---|---|
Utilisez la commande « |
Des paramètres spéciaux de l’interpréteur de commandes sont souvent utilisés dans les scripts de l’interpréteur de commandes.
Tableau 12.3. Liste des paramètres de l’interpréteur de commandes
paramètre de l’interpréteur de commandes | valeur |
---|---|
$0
|
nom de l’interpréteur ou du script de l’interpréteur |
$1
|
premier (1) paramètre de l’interpréteur |
$9
|
neuvième (9) paramètre de l’interpréteur |
$#
|
nombres de paramètres positionnels |
"$*"
|
"$1 $2 $3 $4 … "
|
"$@"
|
"$1" "$2" "$3" "$4" …
|
$?
|
valeur de retour de la commande la plus récente |
$$
|
PID de ce script de l’interpréteur de commandes |
$!
|
PID de la tâche de fond la plus récemment lancée |
Les expansions de paramètres les plus courants à retenir sont les suivants :
Tableau 12.4. Liste des expansions de paramètres de l’interpréteur
forme de l’expression du paramètre |
valeur si var est positionnée
|
valeur si var n’est pas positionnée
|
---|---|---|
${var:-chaîne}
|
« $var »
|
« chaîne »
|
${var:+chaîne}
|
« chaîne »
|
« null »
|
${var:=chaîne}
|
« $var »
|
« chaîne » (et lancer
« var=chaîne »)
|
${var:?chaîne}
|
« $var »
|
echo « chaîne » vers stderr (et quitter avec une erreur)
|
Ici, les deux points « :
» dans tous ces
opérateurs sont en fait optionnels.
avec « :
» =
opérateur de test pour existe et
différent de null
sans « :
» =
opérateur de test pour existe uniquement
Tableau 12.5. Liste des substitutions-clés de paramètres de l’interpréteur
forme de substitution de paramètre | résultat |
---|---|
${var%suffixe}
|
supprimer le motif de suffixe le plus petit |
${var%%suffixe}
|
supprimer le motif de suffixe le plus grand |
${var#préfixe}
|
supprimer le motif de préfixe le plus petit |
${var##préfixe}
|
supprimer le motif de suffixe le plus grand |
Chaque commande retourne un état de sortie qui peut être utilisé pour des expressions conditionnelles.
Succès : 0 (« Vrai »)
Erreur : différent de 0 (« Faux »)
![]() |
Note |
---|---|
« 0 » dans le contexte conditionnel de l’interpréteur signifie « Vrai » alors que « 0 » dans le contexte conditionnel de C signifie « Faux ». |
![]() |
Note |
---|---|
« |
Les idiomes conditionnels de base à retenir sont les suivants :
« <commande> &&
<si_succès_lancer_aussi_cette_commande> || true
»
« <commande> ||
<en_cas_de_non_succès_lancer_aussi_cette_commande> ||
true
»
Un morceau de script sur plusieurs lignes comme le suivant :
if [ <expression_conditionnelle> ]; then <si_succès_lancer_cette_commande> else <si_pas_de_succes_lancer_cette_commande> fi
Ici, le « || true
» était nécessaire pour
s’assurer que ce script de l’interpréteur ne se termine pas accidentellement
à cette ligne lorsque l’interpréteur est appelé avec l’indicateur
« -e
».
Tableau 12.6. Liste des opérateurs de comparaison dans les expressions conditionnelles
équation | condition pour retourner une valeur logique vraie |
---|---|
-e <fichier>
|
<fichier> existe |
-d <fichier>
|
<fichier> existe et est un répertoire |
-f <fichier>
|
<fichier> existe et est un fichier normal (« régulier ») |
-w <fichier>
|
<fichier> existe et peut être écrit |
-x <fichier>
|
<fichier> existe et est exécutable |
<fichier1> -nt <fichier2>
|
<fichier1> est plus récent que <fichier2> (modification) |
<fichier1> -ot <fichier2>
|
<fichier1> est plus ancien que <fichier2> (modification) |
<fichier1> -ef <fichier2>
|
<fichier1> et <fichier2> sont sur le même périphérique et le même numéro d’inœud |
Tableau 12.7. Liste des opérateurs de comparaison de chaîne de caractères dans les expressions conditionnelles
équation | condition pour retourner une valeur logique vraie |
---|---|
-z <str>
|
la longueur de <str> est nulle |
-n <str>
|
la longueur de <str> est non nulle |
<str1> = <str2>
|
<str1> et <str2> sont égales |
<str1> != <str2>
|
<str1> et <str2> ne sont pas égales |
<str1> < <str2>
|
<str1> est trié avant <str2> (dépendant des paramètres linguistiques) |
<str1> > <str2>
|
<str1> est trié après <str2> (dépendant des paramètres linguistiques) |
Les opérateurs de comparaison arithmétique entière dans les expressions
conditionnelles sont « -eq
»,
« -ne
», « -lt
»,
« -le
», « -gt
»
et « -ge
».
Il existe un certains nombre d’idiomes de boucles qu’on peut utiliser avec un interpréteur de commandes POSIX.
« for x in toto1 toto2 ... ; do commande ;
done
» boucle en assignant les éléments de la liste
« toto1 toto2 ...
» à la variable
« x
» et et en exécutant la
« commande
».
« "while condition ; do commande ; done
»
répète la « commande
» tant que la
« condition
» est vraie.
« until condition ; do commande ; done
» répète
la « commande
» tant que
« « condition
» n’est pas vraie.
« break
» permet de quitter la boucle.
« continue
» permet de reprendre l’itération
suivante de la boucle.
![]() |
Astuce |
---|---|
Les itérations numériques semblables à celles du langage C peuvent être réalisées en utilisant
seq(1)
comme générateur de « |
![]() |
Astuce |
---|---|
Consultez Section 9.3.9, « Répéter une commande en bouclant entre des fichiers ». |
En gros, l’interpréteur de commandes traite un script de la manière suivante :
l’interpréteur de commandes lit une ligne :
l’interpréteur de commandes regroupe une partie de la ligne sous forme
d’un élément (« token » si elle
se trouve entre "…"
ou '…'
:
l’interpréteur de commandes découpe les autres parties de la ligne en éléments comme suit :
Espaces : <espace> <tabulation>
<saut-de-ligne>
Métacaractères : < > | ; & ( )
l’interpréteur de commandes vérifie les mots
réservés pour chacun des éléments et ajuste son comportement s’il
ne se trouve pas entre "…"
ou '…'
.
mot réservé : if then elif
else fi for in while unless do done case esac
L’interpréteur de commandes étend les alias s’ils ne se trouvent pas entre
"…"
ou '…'
.
l’interpréteur de commandes étend les tilde s’ils ne se trouvent pas entre
"…"
ou '…'
.
« ~
» → répertoire personnel de l’utilisateur
actuel
« ~<utilisateur>
» → répertoire personnel
de l’<utilisateur>
l’interpréteur de commandes étend les paramètres en leur valeur s’ils ne sont pas entre
'…'
.
paramètre :
« $PARAMETRE
» ou
« ${PARAMETRE}
»
l’interpréteur de commandes étend la substitution de
commande si elle n’est pas entre '…'
.
« $( commande )
» → sortie de la
« commande
»
« ` commande `
» → sortie de la
« commande
»
l’interpréteur de commandes étend les motifs
génériques du chemin aux fichiers correspondants s’ils ne sont
pas entre "…"
ou '…'
.
*
→ n’importe quel caractère
?
→ un caractère
[…]
→ un caractère quelconque parmi
« …
»
l’interpréteur de commandes recherche la commande dans ce qui suit et l’exécute.
définition de fonction
commande interne (« builtin »)
fichier exécutable dans
« $PATH
»
l’interpréteur de commandes passe à la ligne suivante et recommence ce traitement depuis le début de la séquence.
Des guillemets simples dans des guillemets doubles n’ont pas d’effet.
Exécuter « set -x
» dans le script de
l’interpréteur ou l’appel du script avec l’option
« -x
» fait imprimer par l’interpréteur de
commandes toutes les commandes exécutées. C’est assez pratique pour le
débogage.
De façon à rendre vos programmes de l’interpréteur de commandes aussi portables que possible dans tous les systèmes Debian, c’est une bonne idée de limiter les programmes utilitaires à ceux fournis par les paquets essentiels.
« aptitude search ~E
» » affiche la liste
des essentiels.
« dpkg -L <nom_paquet> |grep
'/man/man.*/'
» affiche la liste des pages de manuel pour les
commandes que fournit le paquet <nom_paquet>
.
Tableau 12.8. Lites des paquets comportant des petits programmes utilitaires pour les scripts de l’interpréteur de commandes
paquet | popcon | taille | description |
---|---|---|---|
coreutils
|
V:862, I:999 | 13461 | utilitaires du cœur de GNU |
debianutils
|
V:911, I:999 | 283 | divers utilitaires spécifiques à Debian |
bsdmainutils
|
V:841, I:999 | 562 | collection d’autres utilitaires provenant de FreeBSD |
bsdutils
|
V:810, I:999 | 185 | utilitaires de base provenant de 4.4BSD-Lite |
moreutils
|
V:3, I:17 | 159 | utilitaires supplémentaires d’UNIX |
![]() |
Astuce |
---|---|
Bien que |
L’interface utilisateur d’un simple programme d’interpréteur de commandes
peut être améliorée au-delà de l’interaction bête des commandes
echo
et read
afin de devenir plus
interactive en utilisant un des programmes appelés
« dialogues », etc.
Tableau 12.9. Liste d’interfaces utilisateur
paquet | popcon | taille | description |
---|---|---|---|
x11-utils
|
V:369, I:654 | 593 | xmessage(1) : afficher un message ou une question dans une fenêtre (X) |
whiptail
|
V:442, I:995 | 84 | afficher des boîtes de dialogues conviviales depuis des scripts de l’interpréteur de commandes (newt) |
dialog
|
V:19, I:135 | 1348 | afficher des boîtes de dialogues conviviales depuis des scripts de l’interpréteur de commandes (ncurses) |
zenity
|
V:123, I:490 | 342 | afficher de boîtes de dialogue graphiques depuis des scripts de l’interpréteur de commandes (gtk2.0) |
ssft
|
V:0, I:0 | 152 | Outil frontal de scripts de l’interpréteur de commandes (enrobeur pour zenity, kdialog et dialog avec gettext) |
gettext
|
V:59, I:361 | 6094 |
« /usr/bin/gettext.sh »: traduire des messages
|
Voici un exemple simple qui crée une image ISO avec des données RS02 fournies par dvdisaster(1) :
#!/bin/sh -e # gmkrs02 : Copyright (C) 2007 Osamu Aoki <osamu@debian.org>, Public Domain #set -x error_exit() { echo "$1" >&2 exit 1 } # Initialiser les variables DATA_ISO="$HOME/Desktop/iso-$$.img" LABEL=$(date +%Y%m%d-%H%M%S-%Z) if [ $# != 0 ] && [ -d "$1" ]; then DATA_SRC="$1" else # Sélectionner le répertoire pour la création de l’image ISO à partir d'un dossier du bureau DATA_SRC=$(zenity --file-selection --directory \ --title="Sélectionner la racine de l’arborescence de répertoires pour créer l’image ISO") \ || error_exit "Quitter lors de la sélection du répertoire" fi # Vérifier la taille de l’archive xterm -T "Check size $DATA_SRC" -e du -s $DATA_SRC/* SIZE=$(($(du -s $DATA_SRC | awk '{print $1}')/1024)) if [ $SIZE -le 520 ] ; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="La taille des données convient à pour une sauvegarde sur CD :\\n $SIZE Mo" elif [ $SIZE -le 3500 ]; then zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="La taille des données convient à pour une sauvegarde sur DVD :\\n $SIZE Mo" else zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="La taille des données est trop grande pour une sauvegarde : $SIZE Mo" error_exit "Taille de données trop importante pour la sauvegarde :\\n $SIZE Mo" fi # on n'est certain d'avoir une option -e fonctionnelle uniquement avec xterm # Créer une image ISO brute rm -f "$DATA_ISO" || true xterm -T "genisoimage $DATA_ISO" \ -e genisoimage -r -J -V "$LABEL" -o "$DATA_ISO" "$DATA_SRC" # Créer la redondance RS02 supplémentaire xterm -T "dvdisaster $DATA_ISO" -e dvdisaster -i "$DATA_ISO" -mRS02 -c zenity --info --title="Dvdisaster RS02" --width 640 --height 400 \ --text="Données ISO/RS02 ($SIZE Mo) \\n créées sur : $DATA_ISO" # EOF
Vous désirerez peut-être créer un lanceur sur le bureau avec une commande
définie comme « /usr/local/bin/gmkrs02 %d
».
Make est un utilitaire destiné à la maintenance
d’un groupe de programmes. Lors de l’exécution de
make(1),
make
lit le fichier de règles,
« Makefile
» et met à jour une cible si elle
dépend de fichiers qui ont été modifiés depuis que la cible a été modifiée
pour la dernière fois ou si la cible n’existe pas. L’exécution de ces mises
à jour peut être faite simultanément.
La syntaxe du fichier de règles est la suivante :
cible: [ prérequis... ] [TAB] commande1 [TAB] -commande2 # ignorer les erreurs [TAB] @commande3 # supprimer l’écho
Ici, « [TAB]
» est un code de
tabulation. Chaque ligne est interprétée par l’interpréteur de commandes
après que make ait effectué la substitution des variables. Utilisez
« \
» à la fin d’une ligne pour poursuivre le
script. Utilisez « $$
» pour entrer un
« $
» pour les valeurs des variables
d’environnement d’un script de l’interpréteur de commandes.
On peut écrire des règles implicites pour la cible et les prérequis, par exemple, de la manière suivante :
%.o: %.c header.h
Ici, la cible contient le caractère « %
»
(exactement 1 caractère). Le caractère « %
»
peut correspondre à n’importe quelle sous-chaîne non vide des noms de
fichiers de la cible actuelle. De même pour les prérequis, utilisez
« %
» pour afficher la manière dont leur nom
est en relation avec le nom de la cible actuelle.
Tableau 12.10. Liste des variables automatiques de make
variables automatiques | valeur |
---|---|
$@
|
cible |
$<
|
première exigence |
$?
|
toutes les exigences plus récentes |
$^
|
toutes les exigences |
$*
|
« % » correspond au radical dans le motif cible
|
Tableau 12.11. Liste de l’expansion des variables de make
expansion de la variable | description |
---|---|
toto := titi
|
expansion à la volée |
toto2 = titi
|
expression récursive |
toto3+= titi
|
ajouter |
Exécutez « make -p -f/dev/null
» afin de voir
les règles automatiques internes.
Vous pouvez définir un environnement propre pour compiler des programmes écrits dans le langage de programmation C par ce qui suit :
# apt-get install glibc-doc manpages-dev libc6-dev gcc build-essential
Le paquet libc6-dev
, c’est-à-dire la bibliothèque GNU C,
fournit la bibliothèque C standard
qui est une collection de fichiers d’en-têtes et de routines de bibliothèque
utilisée par le langage de programmation C.
Consultez les références pour C comme suit; :
« info libc
» (références des fonctions de la
bibliothèque C)
gcc(1)
et « info gcc
»
chaque_nom_de_fonction_de la_bibliothèque_C(3)
Kernighan & Ritchie, « Le langage de programmation C », 2ème édition (Prentice Hall)
Un exemple simple « example.c
» peut être
compilé avec la bibliothèque « libm
» pour
donner l’exécutable « run_example
» par ce qui
suit :
$ cat > example.c << EOF #include <stdio.h> #include <math.h> #include <string.h> int main(int argc, char **argv, char **envp){ double x; char y[11]; x=sqrt(argc+7.5); strncpy(y, argv[0], 10); /* évite les débordements de tampon */ y[10] = '\0'; /* remplir afin d'être certain que la chaîne se termine par'\0' */ printf("%5i, %5.3f, %10s, %10s\n", argc, x, y, argv[1]); return 0; } EOF $ gcc -Wall -g -o run_example example.c -lm $ ./run_example 1, 2.915, ./run_exam, (null) $ ./run_example 1234567890qwerty 2, 3.082, ./run_exam, 1234567890qwerty
Ici, « -lm
» est nécessaire pour lier la
bibliothèque « /usr/lib/libm.so
» depuis le
paquet libc6
pour
sqrt(3).
La bibliothèque réelle se trouve dans « /lib/
»
avec le nom de fichier « libm.so.6
» avec un
lien symbolique vers « libm-2.7.so
».
Regardez le dernier paramètre du texte en sortie. Il y a plus de 10
caractères bien que « %10s
» soit indiqué.
L’utilisation de fonctions effectuant des opérations sur des pointeurs en mémoire sans vérification des limites, telles que sprintf(3) et strcpy(3) a été rendue obsolète afin d’éviter les exploits de débordements de tampons qui utilisent les effets des débordements ci-dessus. Utilisez snprintf(3) et strncpy(3) en remplacement..
Le débogage est une partie de l’activité de programmations. Savoir comment déboguer des programmes fera de vous un bon utilisateur de Debian qui pourra produire des rapports de bogues documentés.
Le debogueur primaire sous Debian est gdb(1), il vous permet d’inspecter un programme alors qu’il tourne.
Installons gdb
et les programmes associés par ce qui
suit :
# apt-get install gdb gdb-doc build-essential devscripts
Un bon didacticiel de gdb
est proposé par
« info gdb
«» ou peut être trouvé ailleurs sur le web. Voici un exemple
simple d’utilisation de
gdb(1)
sur un « program
» compilé avec l’option
« -g
» qui produit les informations de
débogage.
$ gdb program (gdb) b 1 # définit un point d'arrêt à la ligne 1 (gdb) run args # lancer les programmes avec des paramètres (gdb) next # ligne suivante ... (gdb) step # avancer d'un pas ... (gdb) p parm # afficher parm ... (gdb) p parm=12 # définir sa valeur à 12 ... (gdb) quit
![]() |
Astuce |
---|---|
De nombreuses commandes de gdb(1) possèdent une abréviation. L’expansion à l’aide de la touche de tabulation fonctionne comme avec l’interpréteur de commandes. |
Comme, par défaut, sous Debian, tous les paquets binaires sont
« strippés » (dépouillés de leurs symboles de débogage), la
plupart des symboles de débogage sont supprimés des paquets normaux. Pour
pouvoir déboguer des paquets Debian à l’aide de
gdb(1),
les paquets *-dbg
correspondants doivent être installés
(par exemple libc6-dbg
dans le cas de
libc6
).
Si un paquet à déboguer ne possède pas de paquet *-dbg
correspondant, vous devrez l’installer après l’avoir reconstruit comme
suit :
$ mkdir /chemin/nouveau ; cd /chemin/nouveau $ sudo apt-get update $ sudo apt-get dist-upgrade $ sudo apt-get install fakeroot devscripts build-essential $ sudo apt-get build-dep nom_paquet_source $ apt-get source nom_paquet $ cd nom_paquet*
Corriger les bogues si nécessaire.
Modifier la version du paquet pour ne pas entrer en collision avec les
versions officielles de Debian, par exemple, en ajoutant
« +debug1
» pour la compilation d’une version
de paquet existante, ou « ~pre1
» pour la
compilation d’une version de paquet qui n’est pas encore diffusée de la
manière suivante :
$ dch -i
Compiler et installer les paquets avec les symboles de débogage comme suit :
$ export DEB_BUILD_OPTIONS=nostrip,noopt $ debuild $ cd .. $ sudo debi nom_paquet*.changes
Vous devrez vérifier les scripts de construction du paquet et vous assurer
que les options « CFLAGS=-g -Wall
» sont
positionnées pour la compilation des binaires.
Si vous rencontrez un plantage de programme, signaler le bogue avec un copier-coller des informations de trace est une bonne idée.
La trace peut être obtenue de la manière suivante :
Lancer le programme sous gdb(1) ;
Reproduire le plantage ;
Vous allez être ramené à l’invite de gdb
;
Entrez « bt
» à l’invite de
gdb
;
Si le programme se fige, vous pouvez le planter en pressant
Ctrl-C
dans le terminal où tourne gdb
pour récupérer l’invite de gdb
;
![]() |
Astuce |
---|---|
Souvent, vous voyez une trace où une ou plusieurs des lignes de départ se
trouvent dans « |
$ MALLOC_CHECK_=2 gdb hello
Tableau 12.12. Liste des commandes avancées de gdb
commande | description des objectifs des commandes |
---|---|
(gdb) thread apply all bt
|
obtenir une trace de tous les processus d’un programme multi-processus (multi-threaded) |
(gdb) bt full
|
obtenir les paramètres qui se trouvent sur la pile d’appel des fonctions |
(gdb) thread apply all bt full
|
obtenir une trace et les paramètres en combinant les options précédentes |
(gdb) thread apply all bt full 10
|
obtenir une trace et les paramètres des 10 premiers appels en supprimant ce qui n’est pas significatif |
(gdb) set logging on
|
écrire le journal de sortie de gdb dans un fichier (le
fichier par défaut est « gdb.txt »)
|
Si un programme apercu1
de GNOME a reçu une erreur X,
vous devriez obtenir un message comme suit :
Le programme 'apercu1' a reçu une erreur du système X Window.
Dans ce cas, vous pouvez essayer de faire tourner le programme avec
« --sync
» et arrêter sur la fonction
« gdk_x_error
» de manière à obtenir une trace.
Utilisez ldd(1) pour trouver les dépendances d’un programme avec des bibliothèques :
$ ldd /bin/ls librt.so.1 => /lib/librt.so.1 (0x4001e000) libc.so.6 => /lib/libc.so.6 (0x40030000) libpthread.so.0 => /lib/libpthread.so.0 (0x40153000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Pour que ls(1) fonctionne dans un environnement `chroot`é, les bibliothèques ci-dessus doivent être disponibles dans votre environnement `chroot`é.
Consultez Section 9.3.6, « Tracer l’activité d’un programme ».
Il y a plusieurs outils de détection des fuites de mémoire disponibles sous Debian.
Tableau 12.13. Liste des outils de détection des fuites de mémoire
paquet | popcon | taille | description |
---|---|---|---|
libc6-dev
|
V:273, I:671 | 11582 | mtrace(1) : fonctionnalité de débogage de malloc dans glibc |
valgrind
|
V:10, I:77 | 89552 | débogueur mémoire et optimiseur |
kmtrace
|
V:2, I:31 | 346 | traceur de fuites de mémoire de KDE utilisant mtrace(1) de glibc |
alleyoop
|
V:0, I:2 | 948 | frontal pour GNOME du vérificateur mémoire Valgrind |
electric-fence
|
V:0, I:12 | 49 | débogueur malloc(3) |
leaktracer
|
V:0, I:4 | 116 | traceur de fuites de mémoire pour les programmes C++ |
libdmalloc5
|
V:0, I:4 | 329 | bibliothèque de débogage de l’allocation mémoire |
Il y a des outils tels que lint pour l’analyse du code statique.
Tableau 12.14. Liste des outils d’analyse du code statique :
paquet | popcon | taille | description |
---|---|---|---|
splint
|
V:0, I:6 | 1836 | outil pour vérifier de manière statique les bogues d’un programme en C |
rats
|
V:0, I:1 | 876 | outil grossier d’audit pour la sécurité (code C, C++, PHP, Perl et Python) |
flawfinder
|
V:0, I:0 | 188 | outil pour examiner le code source en C/C++ et rechercher des faiblesses du point de vue de la sécurité |
perl
|
V:747, I:994 | 16809 | interpréteur ayant un vérificateur de code statique interne : B::Lint(3perl) |
pylint
|
V:2, I:16 | 416 | vérificateur de code statique Python |
jlint
|
V:0, I:0 | 124 | vérificateur de code Java |
weblint-perl
|
V:0, I:3 | 57 | vérificateur de syntaxe et de style minimal pour HTML |
linklint
|
V:0, I:1 | 432 | vérificateur rapide de liens et outils de maintenance de sites web |
libxml2-utils
|
V:27, I:393 | 147 | utilitaires avec xmllint(1) pour valider les fichiers XML |
Flex est un générateur d’analyse lexicale rapide compatible avec Lex.
On trouve un didacticiel de
flex(1)
dans « info flex
».
Vous devez fournir vos propres « main()
» et
« yywrap()
». Sinon votre programme flex
devrait ressembler à ce qui suit pour se compiler sans bibliothèque (cela
parce que « yywrap
» est une macro et que
« %option main
» active de manière implicite
« %option noyywrap
».
%option main %% .|\n ECHO ; %%
Sinon, vous pouvez compiler avec l’option de l’éditeur de liens
« -lfl
» à la fin de la ligne de commandes de
cc(1)
(comme AT&T-Lex avec « -ll
»). L’option
« %option
» n’est pas nécessaire dans ce cas.
Un certain nombre de paquets fournissent un analyseur LR à lecture anticipée (« lookahead ») compatible avec Yacc ou un générateur d’analyseur LALR sous Debian.
Tableau 12.15. Liste de générateurs d’analyseur LALR compatible avec Yacc
paquet | popcon | taille | description |
---|---|---|---|
bison
|
V:16, I:134 | 2047 | générateur d’analyseur GNU LALR |
byacc
|
V:0, I:11 | 146 | générateur d’analyseur Berkeley LALR |
btyacc
|
V:0, I:0 | 248 |
générateur d’analyseur avec retour arrière basé sur byacc
|
On trouve un didacticiel de
bison(1)
dans « info bison
».
Vous devez fournir vos propre « main()
» et
« yyerror()
».
« main()
» appelle
« yyparse()
» qui appelle
« yylex()
», habituellement créé avec Flex.
%% %%
Autoconf est un outil destiné à produire des scripts en shell qui configurent automatiquement un code source de logiciel pour l’adapter à de nombreux types de systèmes « UNIX-like » en utilisant l’ensemble du système de construction GNU.
autoconf(1)
produit le script de configuration
« configure
».
« configure
» crée automatiquement un
« Makefile
» en utilisant le patron
« Makefile.in
».
![]() |
Avertissement |
---|---|
Ne pas écraser les fichiers du système avec les programmes que vous avez compilés en les installant. |
Debian ne touche pas aux fichiers se trouvant dans
« /usr/local/
» ou
« /opt
». Donc, si vous compilez un programme
depuis ses sources, installez-le dans
« /usr/local/
» de manière à ce qu’il
n’interfère pas avec Debian.
$ cd src $ ./configure --prefix=/usr/loca $ make $ make install # cela met les fichiers dans le système
Si vous avez les sources d’origine et s’ils utilisent autoconf(1) et automake(1) et si vous-vous souvenez comment vous l’avez configuré, exécutez-le comme suit pour désinstaller le programme :
$ ./configure « toutes-les-options-que-vous-lui-avez-passé » # make uninstall
Sinon, si vous êtes absolument certain que le processus d’installation n’a
mis des fichiers que sous « /usr/local/
» et
qu’il n’y a là rien d’important, vous pouvez supprimer tout son contenu
avec :
# find /usr/local -type f -print0 | xargs -0 rm -f
Si vous n’êtes pas certain de l’emplacement où les fichiers ont été
installés, vous devriez envisager d’utiliser
checkinstall(8)
du paquet checkinstall
qui fournit une voie propre pour
la désinstallation. Il prend maintenant en charge la création d’un paquet
Debian à l’aide de l’option « -D
».
Bien que tous les scripts en AWK puissent être réécrits automatiquement en Perl en utilisant a2p(1), il est plus facile de convertir manuellement les scripts AWK constitués d’une seule ligne en scripts Perl d’une seule ligne.
Regardons le bout de script AWK suivant :
awk '($2=="1957") { print $3 }' |
Il est équivalent à l’une quelconque des lignes suivantes :
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
La dernière est une devinette. Elle tire parti des fonctionnalités suivantes de Perl :
L’espace est optionnel.
Il existe une conversion automatique des nombres en chaîne de caractères.
Consultez perlrun(1) pour les options de la ligne de commandes. Pour des scripts en Perl plus fous, il peut être intéressant de consulter Perl Golf.
Des pages web dynamiques et interactives simples peuvent être faites de la manière suivante :
Les requêtes sont présentées au navigateur de l’utilisateur en utilisant des formulaires HTML.
Remplir et cliquer sur les entrées de formulaires envoie une des chaînes d’URL suivantes avec des paramètres codés depuis le navigateur vers le serveur web.
« http://www.foo.dom/cgi-bin/programme.pl?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
»
« http://www.foo.dom/cgi-bin/programme.py?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
»
« http://www.foo.dom/programme.php?VAR1=VAL1&VAR2=VAL2&VAR3=VAL3
»
« %nn
» dans l’URL est remplacé par le
caractère dont la valeur hexadécimale est nn
.
La variable d’environnement est définie à :
« QUERY_STRING="VAR1=VAL1 VAR2=VAL2
VAR3=VAL3"
».
Le programme CGI (l’un quelconque des
« programme.*
») sur le serveur web s’exécute
lui-même avec la variable d’environnement
« $QUERY_STRING
».
La sortie standard (stdout)
du programme CGI est envoyée
au navigateur web et présentée sous forme d’une page web dynamique
interactive.
Pour des raisons de sécurité, il est préférable de ne pas réaliser soi-même de nouvelles bidouilles pour analyser les paramètres CGI. Il existe des modules bien établis pour cela, en Perl et Python. PHP est fourni avec ces fonctionnalités. Lorsqu’il est nécessaire d’enregistrer des données du client, on utilise des cookies HTTP. Lorsqu’un traitement de données est nécessaire côté client, on utilise fréquemment Javascript.
Pour davantage d’informations, consultez Common Gateway Interface, The Apache Software Foundation et JavaScript.
Rechercher « CGI tutorial » sur Google en entrant l’URL encodée http://www.google.com/search?hl=en&ie=UTF-8&q=CGI+tutorial directement dans la barre d’adresse du navigateur est une bonne méthode pour voir un script CGI en action sur le serveur Google.
Il existe des programmes pour convertir les codes sources.
Tableau 12.16. Liste des outils de conversion de code source
paquet | popcon | taille | mot clé | description |
---|---|---|---|---|
perl
|
V:747, I:994 | 16809 | AWK→PERL | convertir le code source de AWK vers PERL : a2p(1) |
f2c
|
V:0, I:14 | 424 | FORTRAN→C | convertir le code source de FORTRAN 77 vers C/C++ : f2c(1) |
protoize
|
V:0, I:1 | 125 | ANSI C | créer et supprimer des prototypes ANSI depuis du code C |
intel2gas
|
V:0, I:0 | 113 | intel→gas | convertisseur depuis NASM (format Intel) vers l’Assembleur GNU (GAS) |
Si vous désirez créer un paquet Debian, lisez ce qui suit :
Chapitre 2, Gestion des paquets Debian pour comprendre les bases du système de paquets
Section 2.7.13, « Porter un paquet vers le système stable » pour comprendre les bases du processus de portage
Section 9.10.4, « Système protégé (chroot) » pour comprendre les techniques de base d’un environnement isolé (« chroot »)
debuild(1), pbuilder(1) et pdebuild(1)
Section 12.4.2, « Déboguer un paquet Debian » pour recompiler avec les informations de débogage
Guide du nouveau responsable
Debian comme tutoriel (paquet maint-guide
)
Référence du développeur
Debian (paquet developers-reference
)
Charte Debian (paquet
debian-policy
)
Il existe des paquets tels que dh-make
,
dh-make-perl
, etc., qui facilitent la réalisation des
paquets.