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