SVN - The IC Home Page is in:ic.epfl.ch

Transcription

SVN - The IC Home Page is in:ic.epfl.ch
Plan
Subversion
(SVN)
doxygen
Valgrind
Projets en Informatique :
Outils pour les projets
Subversion (SVN), doxygen, Valgrind
Jamila Sam Haroud
Laboratoire d’Intelligence Artificielle
Faculté I&C
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 1 / 49
Plan
Subversion
(SVN)
doxygen
Plan
◮
Subversion (SVN)
Valgrind
◮
◮
◮
◮
◮
◮
◮
◮
doxygen
◮
◮
◮
◮
◮
◮
◮
◮
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Systèmes de contrôle de révisions
Fonctionnement des outils de versioning
.svn et révisions
Commandes indispensables
Commandes utiles additionnelles
Cycle de travail typique
Références
◮
Documentation d’un projet
Doxygen
Structure d’un projet
Fichier de configuration Doxyfile
Blocs de documentation Doxygen
Balises doxygen importantes
Exemples
Génération de la documentation HTML
Aller plus loin
Projets en Informatique – Cours 3 : Outils pour les projets – 2 / 49
Plan
Subversion
(SVN)
Plan (2)
doxygen
Valgrind
◮
Valgrind
◮
◮
◮
◮
◮
◮
◮
◮
◮
◮
◮
Valgrind et ses outils
L’essentiel en bref
Memcheck
Exemples : lecture/écriture illégale
Exemples : utilisation sans initialisation
Exemples : désallocation illégale
Exemples : mauvais usage (dés)allocateurs
Exemples : fuites mémoire
Limitations de Memcheck
Massif
En savoir plus
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 3 / 49
Plan
Subversion
(SVN)
Subversion (SVN)
doxygen
Valgrind
Subversion (SVN)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 4 / 49
Plan
Subversion
(SVN)
Systèmes de contrôle de révisions
doxygen
Valgrind
SVN, CVS et Git sont les outils de versioning les plus connus.
Ils permettent de gérer un dépot («repository» en anglais) en
fournissant les fonctionalités suivantes :
◮ plusieurs personnes peuvent modifier et gérer en même
temps les mêmes documents
◮
enregistrement de l’historique de modification des documents
au fil des révisions du dépot
◮
possibilité de revenir en arrière à un version précédente
arbitraire
Dans le cadre de ce cours c’est SVN qui va être utilisé.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 5 / 49
Plan
Subversion
(SVN)
Fonctionnement des outils de versioning
doxygen
Valgrind
Comme un serveur de fichiers (architecture client-serveur), mais
se «souvient» de toutes les modifications apportées aux fichiers
par les différentes personnes (y compris les créations et
suppressions de fichiers ou répertoires).
Comment cela s’organise ?
◮
un dépot («repository») est créé sur le serveur SVN et on y
place les fichiers initiaux
◮
chaque utilisateur récupère localement une copie du dépot
SVN (checkout)
◮
après modifications par un utilisateur, celui-ci envoie les
modifications au serveur (commit)
◮
l’utilisateur met à jour sa copie locale du dépot avec les
modification des autres utilisateurs (update)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 6 / 49
Plan
Subversion
(SVN)
Fonctionnement des outils de versioning (2)
doxygen
Valgrind
Lorsque les données sont lues depuis le serveur SVN, il s’agit de
la dernière révision (HEAD), mais on peut demander au serveur
SVN une révision précédente arbitraire et savoir par exemple qui
a modifié tel document de telle révision.
Les outils de contrôle de révision fonctionnent généralement selon
deux modèles de modification de fichiers par plusieurs
personnes :
◮ lock-modify-unlock (!= SVN)
◮
copy-modify-merge (== SVN)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 7 / 49
Plan
Subversion
(SVN)
Fonctionnement des outils de versioning (3)
doxygen
Valgrind
Approche lock-modify-unlock (!= SVN) :
◮ si Jenny veux éditer un fichier, le fichier est vérouillé pour elle,
John ne peut pas le modifier tant que Jenny n’a pas fini ses
modifications
◮
bien que facile à comprendre et à mettre en place, en
pratique ce système est plutôt contre-productif :
◮
pas de travail parallèle possible par Jenny et John sur deux
portions distinctes d’un même document
◮
si Jenny oublie de devérouiller son fichier après modification et
qu’elle part en vacances alors John ne peut pas travailler
dessus
◮
...
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 8 / 49
Plan
Subversion
(SVN)
Fonctionnement des outils de versioning (4)
doxygen
Valgrind
Approche copy-modify-merge (== SVN) :
◮
Jenny et John peuvent travailler en parallèle sur les mêmes
documents (portions identiques ou non d’un même
document)
◮
si les modifications d’un même document sont disjointes,
alors le nouveau document sur le serveur SVN sera la fusion
des deux (opération «merge»)
◮
si les modifications d’un même document se recoupent, alors
aucun mécanisme automatique ne fait le travail de fusion et
une intervention humaine est requise pour résoudre le conflit
Attention ! Bien que le système de fusion des modifications de
SVN soit flexible, SVN n’est pas un substitut à la bonne
communication entre les différents contributeurs d’un projet !
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 9 / 49
Plan
Subversion
(SVN)
.svn et révisions
doxygen
Valgrind
Chaque copie locale d’un dépot SVN contient un sous-répertoire
.svn par répertoire de l’arborescence. Cela permet au système
SVN de savoir quels fichiers ont été modifiés (sur la base des
numéros de révision et des dates de dernière modification) et de
mener à bien les différentes opérations SVN.
Ne pas modifier ou supprimer ces sous-répertoires .svn !
Contrairement à d’autres systèmes de versioning (e.g. CVS), le
numéro de révision s’applique à toute la hiérarchie de fichiers et
pas uniquement à un seul fichier dont le numéro de révision
évolue indépendamment des autres fichiers.
Lorsqu’on parle de example.cpp revision 5, il s’agit du
document example.cpp dans l’état dans lequel il se trouvait à la
révision 5 du dépot SVN.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 10 / 49
Plan
Subversion
(SVN)
Commandes indispensables
doxygen
Valgrind
svn help nom-de-la-commande
◮
permet d’obtenir l’aide spécifique à une certaine commande
◮
probablement la commande la plus importante à retenir
svn checkout URL-du-dépot
◮ permet d’obtenir la dernière révision du dépot donné en
paramètre
◮
le checkout se fait dans le répertoire courant
◮
normalement le checkout ne se fait qu’une seule fois
◮
on peut ajouter l’option --username pour s’identifier comme
un autre utilisateur (option valable également pour les autres
commandes SVN)
◮
svn checkout --username john
https://polysvn.ch/repos/myproject/
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 11 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Commandes indispensables (2)
svn update
◮ permet de mettre à jour sa copie locale avec les dernières
modification du dépot du serveur SVN
◮
à exécuter dans le répertoire de travail
◮
on peut spécifier un nom de fichier pour limiter la mise à jour
à ce fichier
svn commit
◮ permet de publier sur le serveur SVN les modification
apportées localement
◮
on peut spécifier un nom de fichier pour ne publier que lui
◮
-m "mon nom: mon commentaire" est l’option qui
permet d’ajouter un commentaire de publication
◮
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
svn commit example.cpp -m "Jenny: I’ve changed
init values in Example::Example()"
Il est souhaitable de ne pas ajouter les fichier .o ou les
exécutables au dépot SVN, uniquement des fichiers texte (code
source, documentation, ...)
Projets en Informatique – Cours 3 : Outils pour les projets –
12 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Commandes indispensables (3)
États possibles d’un fichier dans un répertoire de travail SVN et
impact des commandes commit et update :
dernière
version
non modifié
commit pas d’effet
commit
publie les modifications apportées au
document
update
pas d’effet
update
pas d’effet
commit
pas d’effet
commit
échec
et
erreur
out-of-date (donc
d’abord procéder à la
commande update)
importe les derniers
changements apportés au document
update
tentative de fusion de
la version du serveur
avec la version locale,
si échec alors intervention humaine requise
ancienne
update
version
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
modifié
Projets en Informatique – Cours 3 : Outils pour les projets – 13 / 49
Plan
Subversion
(SVN)
doxygen
Commandes utiles additionnelles
◮
Valgrind
svn add / mkdir / delete / move / copy
◮
◮
svn import
◮
◮
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
revenir à la dernière version en cache du répertoire
administratif .svn
svn resolve
◮
c EPFL 2002–2012
visualise les différences entre deux révisions d’un fichier
svn revert nom-de-fichier
◮
◮
obtenir l’historique des modification pour un certain document
svn diff
◮
◮
obtenir l’état des documents dans le répertoire courant
svn log nom-de-fichier
◮
◮
permet d’ajouter un arborescence de documents
svn status --verbose
◮
◮
planifie les taches d’ajout / suppression / déplacement / copie
pour le prochain commit
permet la résolution de conflits qui pourraient apparaitre lors
d’un update
Projets en Informatique – Cours 3 : Outils pour les projets – 14 / 49
Plan
Subversion
(SVN)
Comment mettre votre projet sous SVN (1)
doxygen
Valgrind
◮
Créez un répositoire, par exemple bact-43 (où 43 est votre
numéro de groupe), sous :
http://svn.epfl.ch/
◮
Ce répositoire sera structuré par défaut en trois
sous-répertoires : trunk, branches et tags.
Supposons que sur votre compte le code du projet soit dans
le répertoire prjSV/projet, placez-vous dans ce répertoire
(via un terminal: cd prjSV/projet).
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 15 / 49
Plan
Subversion
(SVN)
Comment mettre votre projet sous SVN (2)
doxygen
Valgrind
◮
Importez votre projet dans votre répositoire :
svn import -m "initial import" \
https://svn.epfl.ch/svn/bact-43/trunk/
◮
Installez chez vous une copie du projet sous SVN :
◮
◮
◮
Placez vous dans votre répertoire prjSV : cd prjSV.
Installez une copie de votre projet à ce niveau de
l’arborescence:
svn checkout https://svn.epfl.ch/svn/bact-43/
Vous travaillerez désormais dans le répertoire
prjSV/bact-43 au lieu du répertoire prjSV/projet (que
vous pourrez effacer après vous être assuré que le checkout
a fonctionné correctement).
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 16 / 49
Plan
Subversion
(SVN)
Cycle de travail typique
doxygen
Valgrind
1. Mise à jour de la copie locale du dépot
◮
svn update
2. Modification des fichiers
◮
édition des fichiers
◮
svn add / delete / move / copy / mkdir
3. Vérification / annulation des modifications
◮
svn status / diff
◮
svn revert
4. Mise à jour avant publication
◮
svn update (+ svn resolve si conflits rencontrés)
5. Publication des modifications
◮
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
svn commit
Seules les commandes update et commit nécessitent l’accès au
serveur SVN. Les autres commandes n’agissent que localement.
Projets en Informatique – Cours 3 : Outils pour les projets – 17 / 49
Plan
Subversion
(SVN)
Références
doxygen
Valgrind
◮
Version Control with Subversion
http://svnbook.red-bean.com/
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 18 / 49
Plan
Subversion
(SVN)
doxygen
doxygen
Valgrind
doxygen
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 19 / 49
Plan
Subversion
(SVN)
Documentation d’un projet
doxygen
Valgrind
Pourquoi documenter ?
À cause du principe «Say what you do and do what you say».
Pour soi-même et pour les autres.
Lorsque les projets deviennent conséquents, c’est une aide pour
comprendre son propre code et surtout pour que les autres
puissent le comprendre (le prochain programmeur, l’utilisateur du
code, . . . ).
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 20 / 49
Plan
Subversion
(SVN)
doxygen
Documentation d’un projet (2)
Comment documenter ?
Valgrind
La documentation ne consiste pas à paraphraser le code, mais
vraiment à expliquer ce qu’il fait (comment, en utilisant quoi, en
produisant quoi) et si possible pourquoi il a été écrit ainsi.
Faux:
◮ «..., on incrémente le compteur i, on compare le i-ème
élément avec le caractère c, si les deux sont identiques alors
...»
Juste:
◮ «On traverse tous les éléments de la chaine de caractères
fournie et on s’arrête à l’élément correspondant au caractère
fourni. La position correspondante est retounée.»
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Il ne faut ni trop ni trop peu documenter, et surtout ne pas
attendre la fin du projet pour rédiger la documentation !
Projets en Informatique – Cours 3 : Outils pour les projets – 21 / 49
Plan
Subversion
(SVN)
Doxygen
doxygen
Valgrind
Doxygen est un outil de documentation utile pour les projets en C
et C++ mais gère également d’autres langages de programmation
(Java, Python, PHP, . . . ).
Il génère la documentation d’un projet par extraction des
commentaires placés dans le code source.
La documentation est générée par défaut en formats HTML et
LaTeX, mais d’autres formats sont également possibles (RTF,
CHM, . . . ).
Doxygen est disponible sur toutes les plate-formes courantes.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 22 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Structure d’un projet
Avant de documenter un projet avec Doxygen, il faut connaître
la structure du répertoire de travail :
/bin
/doc
/obj
/res
/src
JOURNAL
Makefile
...
La configuration de Doxygen dépend de la structure du
répertoire de travail.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Il va falloir indiquer à Doxygen quels répertoires scanner à la
recherche de commentaires dans les fichiers source (i.e. /src en
l’occurrence) pour générer la documentation et dans quel
répertoire placer cette documentation (i.e. /doc).
Projets en Informatique – Cours 3 : Outils pour les projets – 23 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Fichier de configuration Doxyfile
Chaque projet qui doit être documenté avec Doxygen doit avoir
son fichier de configuration Doxyfile.
La commande doxygen -g dans le répertoire de travail génère
le fichier Doxyfile par défaut.
Il faut modifier/compléter ce fichier aux endroits suivants :
PROJECT_NAME
= le-nom-de-mon-projet
OUTPUT_DIRECTORY = ./doc
INPUT
= ./src
FILE_PATTERNS
= *.c *.h *.cc *.cpp *.hpp
Les autres paramètres peuvent être laissées à leurs valeurs par
défaut.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Si vous ne savez pas vraiment à quoi un paramètre du fichier
Doxyfile correspond, lisez les commentaires descriptifs qui
précèdent les lignes de configuration, tout y est bien documenté.
Projets en Informatique – Cours 3 : Outils pour les projets – 24 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Blocs de documentation Doxygen
Plusieurs styles de blocs de documentation sont possibles.
Celui qui est le plus souvent utilisé pour C/C++ est le suivant :
/*!
* ... Documentation ...
*/
Les alternatives possibles pour C et C++ sont :
/**
* ... Documentation ...
*/
///
///... Documentation ...
///
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
//!
//!... Documentation ...
//!
Projets en Informatique – Cours 3 : Outils pour les projets – 25 / 49
Plan
Subversion
(SVN)
doxygen
Balises doxygen importantes
◮
\mainpage titre-page-principale
◮
\file nom-de-fichier
◮
\brief courte-description
\author auteur1 auteur2 ...
\version numéro-version
\date la-date
Valgrind
◮
◮
◮
◮
◮
◮
◮
\fn prototype-de-la-fonction
\param nom-du-paramètre sa-description
\return description-de-valeur-de-retour
◮
\bug description-du-bug
◮
◮
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
\class nom-de-la-classe
\struct nom-de-structure
\enum nom-de-l’énumération
Projets en Informatique – Cours 3 : Outils pour les projets – 26 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Exemples
Bloc de page principale avec listes :
/*!
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
\mainpage CellReplication
\author Captain Awesome
\section introduction Introduction
This page is dedicated to project overview.
\section how_what_who How, what and who ?
Here you should tell us about :
- how your project works
-# from a user’s perspective
-# from a developer’s perspective
- what are the main conceptual ideas behind it
- who it is intended for
- what are que prerequisites
- what are the current limitations
- ...
Projets en Informatique – Cours 3 : Outils pour les projets – 27 / 49
Plan
Subversion
(SVN)
Exemples (2)
doxygen
Valgrind
☞ Note :
Le bloc de page principale ne doit être utilisé qu’une seule fois
et est à placer par exemple au début du fichier source qui
contient le main.
Bloc de début de fichier :
/*!
*
*
*
*
*
*/
c EPFL 2002–2012
\file Cell.hpp
\brief The header file of the Cell class.
\author Sum Wan
\version 0.1
\date 2010.08.26
☞ Note :
Le bloc de début de fichier est à insérer au début de chaque fichier.
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 28 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Exemples (3)
Bloc de début de classe :
/*!
* \class Cell
* \brief Our class encapsulating the
representation of a cell.
*
*
* Here is a more descriptive explanation on the
* true purpose of existance for the class and an
* overview of the underlying design rules
* justifying the approach.
*/
class Cell
{
...
}
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
☞ Note :
Le bloc de début de classe est à insérer avant le début de la classe à
documenter.
Projets en Informatique – Cours 3 : Outils pour les projets – 29 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Exemples (4)
Bloc de début de méthode :
/*!
*
*
*
*
*
*
*
*
*/
int
{
\fn int main(int argc, char* argv[])
\brief The main() function
\param argc Number of program launch
parameters
\param argv Array of strings representing
the parameters
\return 0 if no problem is encountered
main(int argc, char* argv[])
...
return 0;
}
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
☞ Note :
Le bloc de début de méthode est à insérer avant le début de la méthode
à documenter.
Projets en Informatique – Cours 3 : Outils pour les projets – 30 / 49
Plan
Subversion
(SVN)
Génération de la documentation
doxygen
Valgrind
La commande doxygen fichier-de-configuration dans le
répertoire de travail lance la génération de la documentation selon
le fichier de configuration fourni (normalement Doxyfile).
Doxygen signale des warnings si des méthodes ne sont pas
documentées.
Il est donc conseillé de systématiquement placer un bloc de
documentation en début de chaque fichier source et avant
chaque méthode.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 31 / 49
Plan
Subversion
(SVN)
Aller plus loin
doxygen
Valgrind
Doxygen intègre le support de graphviz pour générer des
diagrammes d’héritage des classes.
◮ www.graphviz.org/
◮
pour permettre de générer les graphes : HAVE_DOT = YES
dans le Doxyfile.
Manuel officiel pour Doxygen
◮
www.stack.nl/~dimitri/doxygen/manual.html
◮
www.stack.nl/~dimitri/doxygen/commands.html
(pour la liste complète des balises)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 32 / 49
Plan
Subversion
(SVN)
Valgrind
doxygen
Valgrind
Valgrind
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 33 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Valgrind et ses outils
Valgrind est un outil pour programmeurs accompagné d’un
ensemble d’utilitaires annexes servant à l’analyse d’utilisation de
la mémoire et l’analyse de performance.
Ces outils annexes sont :
◮ Memcheck
◮
◮
Massif
◮
◮
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
outil d’analyse de l’utilisation de la cache du processeur
Helgrind
◮
c EPFL 2002–2012
Jamila Sam
outil d’analyse de la quantité de mémoire utilisée
Cachegrind
◮
◮
debugger permettant de détecter les problèmes liés à la
mauvaise gestion de la mémoire
outil de recherche de concurrences pour programmes
multi-processus
Memcheck sera l’outil que vous utiliserez à ce stade.
Projets en Informatique – Cours 3 : Outils pour les projets – 34 / 49
Plan
Subversion
(SVN)
L’essentiel en bref
doxygen
Valgrind
◮
Valgrind fonctionne sur Linux pour les architectures
x86/x86-64/PPC
◮
Valgrind intervient sur des programmes (binaires) et est
indépendant du langage de programmation utilisé
(pas besoin du code source pour exécuter Valgrind)
◮
Valgrind recompile le code binaire de l’exécutable à tester
et induit au passage des ralentissements d’exécution
typiquement de l’ordre de 5x
◮
Valgrind permet d’éviter des heures de debugging
◮
Valgrind peut aider à rendre un programme plus rapide
◮
Valgrind est utilisé sur de très gros projets
(>25M lignes de code)
◮
Valgrind est gratuit et open source
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 35 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Memcheck
Memcheck vérifie toutes les lectures/écritures en mémoire et
intercepte les appels à malloc/new/free/delete.
Memcheck est capable de détecter :
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
◮
les lectures/écritures dans des zones mémoire non valides
(zones mémoire libérées, en dehors des zones mémoire
allouées, . . . )
◮
l’utilisation de mémoire non initialisée
◮
les fuites de mémoire (pointeurs perdus, . . . )
◮
...
Les fuites mémoire sont parmi les erreurs les plus difficiles à
détecter car elles ne causent souvent pas de problème dans
l’immédiat mais deviennent problématiques si un portion de code
qui génère des fuites est exécutée de manière récurrente et
provoque une erreur out of memory (ou bien le
swapping/paging).
Projets en Informatique – Cours 3 : Outils pour les projets – 36 / 49
Plan
Subversion
(SVN)
Memcheck (2)
doxygen
Valgrind
Prérequis : il faut que le programme ait été compilé avec les
informations de debugging
◮ g++ -c example.cpp -g -o example
Pour lancer Memcheck :
◮ valgrind --tool=memcheck --leak-check=full
./nom-du-programme
Si une fuite mémoire existe, Memcheck signale des nombres
différents d’allocations et de désallocations.
Beaucoup de cas différents liés à la mauvaise gestion de la
mémoire peuvent se présenter, voyons quelques exemples...
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 37 / 49
Plan
Subversion
(SVN)
Exemples : lecture/écriture illégale
doxygen
Valgrind
1 | int main()
2 | {
3 |
double* p;
4 |
p = 0x00000000;
5 |
6 |
double r;
7 |
r = *p;
8 |
9 |
return 0;
10| }
Invalid read of size 8
at 0x4005C4: main (memcheck.cpp:7)
Address 0x0 is not stack’d, malloc’d or (recently) free’d
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 38 / 49
Plan
Subversion
(SVN)
Exemples : lecture/écriture illégale (2)
doxygen
Valgrind
1 | int main()
2 | {
3 |
double *p;
4 |
p = new double[3];
5 |
6 |
for (int i(0); i<=3; i++)
7 |
p[i] = 1.0;
8 |
9 |
delete [] p;
10|
11|
return 0;
12| }
Invalid write of size 8
at 0x4006AA: main ( /home/rouvinez/memcheck.cpp:7)
Address 0x595f058 is 0 bytes after a block of size 24 alloc’d
at 0x4C28939: operator new[](unsigned long) (vg_replace_malloc.c:305)
by 0x400685: main (in /home/rouvinez/memcheck.cpp : 4)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 39 / 49
Plan
Subversion
(SVN)
Exemples : utilisation sans initialisation
doxygen
Valgrind
1
2
3
4
5
6
7
8
| int main()
| {
|
double* p;
|
|
delete p;
|
|
return 0;
| }
Conditional jump or move depends on uninitialised value(s)
at 0x4C27D82: operator delete(void*) (vg_replace_malloc.c:387)
by 0x400637: main (memcheck.cpp:5)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 40 / 49
Plan
Subversion
(SVN)
Exemples : utilisation sans initialisation (2)
doxygen
Valgrind
1 | int main()
2 | {
3 |
double r;
4 |
5 |
if (r == 0)
6 |
{
7 |
r = 9001;
8 |
}
9 |
10|
return 0;
11| }
Le compilateur C++ signale
un warning dans ce cas !
Conditional jump or move depends on uninitialised value(s)
at 0x4005C1: main (in /home/rouvinez/example.cc : 5)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 41 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Exemples : désallocation illégale
1 | int main()
2 | {
3 |
double* p;
4 |
p = new double[40];
5 |
6 |
for (int i(0); i<40; i++)
7 |
*(p++) = 0.5 * i;
8 |
9 |
delete [] p;
10|
11|
return 0;
12| }
Invalid free() / delete / delete[]
at 0x4C27A4B: operator delete[](void*) (vg_replace_malloc.c:409)
by 0x4006D2: main (example.cpp:9)
Address 0x595f180 is 0 bytes after a block of size 320 alloc’d
at 0x4C28939: operator new[](unsigned long) (vg_replace_malloc.c:305)
c EPFL 2002–2012
by 0x400685: main (example.cpp:4)
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 42 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Exemples : désallocation illégale (2)
1 | int main()
2 | {
3 |
double *p, *q;
4 |
p = new double(18);
5 |
q = p;
6 |
7 |
delete p;
8 |
delete q;
9 |
return 0;
10| }
Invalid free() / delete / delete[]
at 0x4C27DCF: operator delete(void*) (vg_replace_malloc.c:387)
by 0x4006B9: main (example.cpp:8)
Address 0x595f040 is 0 bytes inside a block of size 8 free’d
at 0x4C27DCF: operator delete(void*) (vg_replace_malloc.c:387)
by 0x4006AD: main (example.cpp:7)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
total heap usage: 1 allocs, 2 frees, 8 bytes allocated
Projets en Informatique – Cours 3 : Outils pour les projets – 43 / 49
Plan
Subversion
(SVN)
Exemples : mauvais usage (dés)allocateurs
doxygen
Valgrind
1
2
3
4
5
6
7
8
9
| int main()
| {
|
double* p;
|
p = new double[40];
|
|
delete p;
|
|
return 0;
| }
Mismatched free() / delete / delete []
at 0x4C27DCF: operator delete(void*) (vg_replace_malloc.c:387)
by 0x400695: main (example.cpp:6)
Address 0x595f040 is 0 bytes inside a block of size 320 alloc’d
at 0x4C28939: operator new[](unsigned long) (vg_replace_malloc.c:305)
by 0x400685: main (example.cpp:4)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 44 / 49
Plan
Subversion
(SVN)
Exemples : fuites mémoire
doxygen
Valgrind
1 | int main()
2 | {
3 |
double *p;
4 |
p = new double[512];
5 |
p = new double[16];
6 |
7 |
delete [] p;
8 |
9 |
return 0;
10| }
1 double =
=
64 bits
8 bytes
512 double = 4096 bytes
HEAP SUMMARY:
in use at exit: 4,096 bytes in 1 blocks
total heap usage: 2 allocs, 1 frees, 4,224 bytes allocated
4,096 bytes in 1 blocks are definitely lost in loss record 1 of 1
at 0x4C28939: operator new[](unsigned long) (vg_replace_malloc.c:305)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
by 0x400685: main (in /home/rouvinez/example)
Projets en Informatique – Cours 3 : Outils pour les projets – 45 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Exemples : fuites mémoire (2)
1
1 | int main()
2 | {
3 |
double* p;
40
4 |
p = new double[40];
5 |
6 |
for (int i(0); i<40; i++)
7 |
*(p++) = 0.5 * i;
8 |
9 |
return 0;
10| }
double =
=
64 bits
8 bytes
double = 320 bytes
320 bytes in 1 blocks are definitely lost in loss record 1 of 1
at 0x4C28939: operator new[](unsigned long) (vg_replace_malloc.c:305)
by 0x400635: main (example.cpp:4)
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
LEAK SUMMARY:
definitely lost:
indirectly lost:
possibly lost:
still reachable:
suppressed:
320 bytes in
0 bytes in 0
0 bytes in 0
0 bytes in 0
0 bytes in 0
1 blocks
blocks
blocks
blocks
blocks
Projets en Informatique – Cours 3 : Outils pour les projets – 46 / 49
Plan
Subversion
(SVN)
doxygen
Valgrind
Limitations de Memcheck
Valgrind ne vérifie pas les sorties des limites de tableau
statiques.
int main()
{
double p[42];
p[42] = 1.618;
}
☞ Transformer en tableau alloué dynamiquement pour les besoins
du test
Pour fonctionner, Valgrind utilise beaucoup de mémoire,
aisément jusqu’à deux fois plus que le programme à tester
n’utilise normalement, cela peut poser problème pour le test de
programmes nécessitant beaucoup de ressources.
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Mais en dehors de ces cas particuliers, Memcheck (+
Valgrind) est un outil puissant qu’il ne faut pas hésiter à
utiliser autant que possible.
Projets en Informatique – Cours 3 : Outils pour les projets – 47 / 49
Plan
Subversion
(SVN)
Massif
doxygen
Valgrind
Massif est l’autre outil de la collection Valgrind qui permet de
«monitorer» la mémoire, la consommation de mémoire en
l’occurrence.
Pour lancer Massif puis ms_print (pour visualiser les données de
Massif) :
◮ valgrind --tool=massif ./nom-du-programme
◮
ms_print fichier-massif.out
Mais Massif fournit probablement trop de détails pour vos
besoins.
Le suivi de la quantité de mémoire utilisée par vos programmes
peut être fait de manière satisfaisante avec la commande top.
◮
top -p PID-du-programme ← montre uniquement ce programme
◮
top -U username ← montre tous vos programmes
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 48 / 49
Plan
Subversion
(SVN)
En savoir plus
doxygen
Valgrind
◮
Memcheck
◮
◮
http://valgrind.org/docs/manual/mc-manual.html
Massif
◮
http://valgrind.org/docs/manual/ms-manual.html
c EPFL 2002–2012
Jamila Sam
ÉC O L E P O L Y T E C H N I Q U E
FÉ DÉR A L E D E L A U S A N N E
Projets en Informatique – Cours 3 : Outils pour les projets – 49 / 49

Documents pareils