Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
gdb [Le 08/07/2007, 16:17] thedamocles Déplacée de http://doc.ubuntu-fr.org/debuggage |
gdb [Le 11/09/2022, 11:47] (Version actuelle) moths-art Suppression des espaces en fin de ligne (détecté et corrigé via le bot wiki-corrector (https://forum.ubuntu-fr.org/viewtopic.php?id=2067892) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | {{tag>dapper edgy feisty compilation developpement programmation}} | + | {{tag>compilation programmation}} |
---- | ---- | ||
====== Débuggage avec gdb ====== | ====== Débuggage avec gdb ====== | ||
- | |||
===== Description ===== | ===== Description ===== | ||
- | gdb, acronyme de GNU DeBugger, est un programme qui, comme son nom l'indique, permet de débugger un programme. Il permet donc de traquer les bugs/erreurs se trouvant dans tout programme. | + | gdb, acronyme de GNU DeBugger, est un programme qui, comme son nom l'indique, permet de débugger un programme (langages C et C++ principalement, ainsi que d'autres : fortran 77, etc..). Il permet donc de traquer les bugs/erreurs se trouvant dans tout programme. |
Cet outil, indispensable à tout programmeur, bien que très performant n'est disponible qu'avec une interface en ligne de commande. Heureusement, il existe des interfaces graphiques qui facilitent le débuggage. | Cet outil, indispensable à tout programmeur, bien que très performant n'est disponible qu'avec une interface en ligne de commande. Heureusement, il existe des interfaces graphiques qui facilitent le débuggage. | ||
+ | |||
===== Installation ===== | ===== Installation ===== | ||
- | [[:tutoriel:comment_installer_un_paquet|installer les paquets]] suivants: | + | [[:tutoriel:comment_installer_un_paquet|Installez les paquets]] **[[apt>build-essential,gdb]]** |
- | * **build-essential** | + | |
- | * **gdb** | + | |
- | et éventuellement: | + | Si vous développez en utilisant une bibliothèque particulière, vous pouvez éventuellement installer le paquet de débuggage, dont le nom finit par **-dbg**, en plus du paquet de développement (dont le nom finit par **-dev**). |
- | * les paquets se terminant par **-dev** indispensable pour la compilation | + | |
- | * les paquets se terminant par **-dbg** contenant les informations de débuggage d'un programme donné. | + | |
- | ===== Utilisation ===== | + | ===== Utilisation basique ===== |
+ | ==== Compilation du programme pour le débuggage ==== | ||
+ | Pour que gdb puisse débugger un programme, il a besoin des informations de débuggage, qui peuvent être ajoutées en ajoutant l'option **-g** au compilateur. | ||
+ | Exemple : | ||
+ | <code>gcc -g toto.c -o toto</code> | ||
+ | ==== Lancement de gdb ==== | ||
+ | Un fois le programme compilé, invoquez gdb comme ceci : | ||
- | ==== Compilation du programme pour le débuggage ==== | + | <code>gdb toto</code> |
- | Pour que gdb puisse débugger un programme il a besoin des informations de débuggage. | + | <note tip>on peut lancer avec l'option //-tui// |
+ | <code>gdb -tui toto</code> | ||
+ | qui permet de visualiser le code, les points d'arrêt… bref plus visuel… mais semble buggé | ||
+ | </note> | ||
+ | Dans l'interface de gdb, vous pouvez lancer le programme avec **run** et quitter le débogueur avec **quit**. | ||
+ | À tout moment, vous pouvez interrompre le programme avec le raccourci clavier **Ctrl+C** dans le terminal. La commande **where** vous permettra alors de voir la pile des appels. | ||
+ | Pour reprendre l'exécution du programme, tapez **continue**. | ||
- | Pour les obtenir il faut l'indiquer au compilateur: | + | Si vous souhaitez changer l'exécutable ciblé par gdb, **exec monexecutable** peut vous être utile. |
- | <code>gcc -g toto.c -o toto</code> | + | |
+ | La commande **start** lance le programme et s'arrête à la première ligne : la commande "n" permet ensuite de faire du pas-à-pas. | ||
+ | <note>Si le programme a des paramètres d'entrée, il faut les ajouter à la suite de **run** (ou **start**) ou le mettre en ligne de commande (attention, taper **gdb --args monprogramme monoption mesoptions**).</note> | ||
- | ==== Débuggage du programme ==== | + | ==== Résumé des principales commandes ==== |
- | Un fois le programme compilé, invoquez gdb comme ceci : | + | |
- | <code>run gdb toto</code> | + | ^commande ^raccourci ^effet ^ |
+ | |run | r | lance le programme (s'arrête au prochain point d'arrêt) | | ||
+ | |continue | c | relance le programme (s'arrête au prochain point d'arrêt) | | ||
+ | |~~~ | ~~~ | ~~~ | | ||
+ | |break [yyy.c:]xx | b [yyy.c:]xx | place un point d'arrêt à la ligne xx du fichier yyy.c (si indiqué) | | ||
+ | |info breakpoints | info breakpoints | liste les points d'arrêts | | ||
+ | |delete [x] | d [x] | efface les points d'arrêts si pas d'argument, ou le point d'arrêt correspondant au n° x | | ||
+ | |~~~ | ~~~ | ~~~ | | ||
+ | |next | n | exécute une instruction (ne rentre pas dans les fonctions) peut-être suivi du nombre de ligne à exécuter | | ||
+ | |step | s | exécute une instruction (rentre potentiellement dans les fonctions) | | ||
+ | |finish | f | exécute les instructions jusqu'à la sortie de la fonction | | ||
+ | |list | l | affiche 10 lignes de code centrée sur la ligne à exécuter | | ||
+ | |until xx | u xx | exécute les instructions jusqu'à la ligne xx | ||
+ | | | ||
+ | | | ||
+ | |monitor reset halt | | reset la target, permet de recommencer l'execution et le debug depuis le debut du code | ||
+ | |||
+ | |||
+ | ===== Utilisation avancée ===== | ||
+ | |||
+ | ==== Placer des points d'arrêt (breakpoints) ==== | ||
+ | |||
+ | Si vous soupçonnez une fonction particulière de faire bugger votre programme, vous pouvez placer un //breakpoint// (point d'arrêt) avant le lancement de cette fonction. Pour ce faire, utilisez la commande **break mafonction** (sans les parenthèses). | ||
+ | |||
+ | Si la fonction désirée est située dans une classe ou un //namespace// (espace de noms) **niveau_englobant**, elle est accessible depuis **niveau_englobant::mafonction**. | ||
+ | |||
+ | Pour afficher la liste des points d'arrêt, utilisez **info breakpoints**. Vous remarquerez que chaque point d'arrêt est identifié par un numéro : | ||
+ | <code>(gdb) info breakpoints | ||
+ | Num Type Disp Enb Address What | ||
+ | 1 breakpoint keep y 0x08049850 in thor::GameApp::catchEvents() | ||
+ | at src/gameapp.cpp:104</code> | ||
+ | Ici, il a pour identifiant 1. S'il ne vous intéresse plus, vous pouvez le supprimer avec la commande **delete 1**. | ||
+ | |||
+ | <note tip>Plus généralement, on peut placer un point d'arrêt à la ligne xx en écrivant ''break xx''</note> | ||
+ | |||
+ | Pour aller au prochain point d'arrêt, écrire ''continue''. | ||
+ | |||
+ | ==== Afficher la valeur d'une variable ==== | ||
+ | |||
+ | Il est possible d'afficher la valeur d'une variable une fois que le programme a été interrompu, grâce à la commande <code>print ma_variable</code> | ||
+ | ou encore, en abbrégé et en spécifiant un type (x:hexa, d:decimal, f:float, c:char, s:string… help x pour les voir tous): | ||
+ | <code>p/f ma_variable_reelle</code> | ||
+ | La même remarque (§ précédent) sur la portée, concernant les classes et les espaces de nom s'applique ici.\\ | ||
+ | et pour une variable qui est un tableau de char de 16 caractères: | ||
+ | <code>p/c ma_char_chaine@16</code> | ||
===== Interfaces graphiques ===== | ===== Interfaces graphiques ===== | ||
- | Il existe de multiples interfaces graphiques pour gdb qui facilitent grandement le débuggage en affichant le code source, créant des schémas représentant les variables, ... | ||
- | en voici quelques-unes: | + | Il existe de multiples interfaces graphiques pour gdb qui facilitent grandement le débuggage en affichant le code source, créant des schémas représentant les variables, etc. En voici quelques-unes : |
- | * xxgdb: interface de gdb pour X | + | |
+ | * Nemiver: interface de gdb s'intégrant bien à Gnome | ||
+ | * [[http://kdbg.org|Kdbg]]: interface de gdb s'intégrant bien à KDE | ||
* ddd: interface graphique très complète pour de nombreux debuggers dont gdb | * ddd: interface graphique très complète pour de nombreux debuggers dont gdb | ||
- | * cgdb: interface de type ncurses | + | * xxgdb: interface de gdb pour X |
+ | * [[https://github.com/cgdb/cgdb|cgdb]]: interface de type ncurses | ||
* gdb-mode pour emacs | * gdb-mode pour emacs | ||
- | * généralement, les IDE comprennent aussi une interface à gdb | ||
- | ===== liens ===== | + | ==== Pour Vim/GVim ==== |
- | * La documentation officielle: [[http://sourceware.org/gdb/documentation/]] | + | * [[https://github.com/larrupingpig/vimgdb-for-vim7.4|VimGDB]] |
- | * Un tutorial: [[http://www.linux-france.org/article/devl/gdb_howto.html]] | + | * [[https://www.vim.org/scripts/script.php?script_id=4582|Conque GDB]] |
- | * Le site de ddd: [[http://www.gnu.org/software/ddd/]] | + | * [[https://sourceforge.net/projects/clewn|Clewn]] |
- | * Le site de cgdb: [[http://cgdb.sourceforge.net/]] | + | |
- | * Utilisation de gdb-mode: [[http://www.linux-france.org/article/devl/gdb.html]] | + | ==== Pour IDE ==== |
- | * Carte de référence: [[http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf]] | + | Aussi, quelques environnements de développement incluent une interface graphique pour **gdb** ; c'est le cas d'[[:anjuta|Anjuta]], d'[[:eclipse|Eclipse]] ou encore de [[:kdevelop|KDevelop]]. |
+ | |||
+ | ===== Concurrents ===== | ||
+ | |||
+ | Enfin signalons le concurrent **idb** (d'intel, non libre) qui a un mode "gdb" (même syntaxe) et qui affiche correctement les tableaux, ce qui n'est pas le cas de gdb pour le [[fortran]]. Il s'installe en même temps que le compilateur [[fortran#intel_fortran_compiler|ifort]]. | ||
+ | <note>Pas besoin de compiler avec ifort pour déboguer avec idb.</note> | ||
+ | |||
+ | ===== Liens ===== | ||
+ | * (en) [[http://sourceware.org/gdb/documentation/|La documentation officielle]] | ||
+ | * (fr) [[http://www.linux-france.org/article/devl/gdb_howto.html|Un tutorial simple sur linux-france.org]] | ||
+ | * (fr) [[https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/gdb.html|tuto de Anne Canteaut de l'INRIA, bien documenté]] | ||
+ | * (fr) [[https://openclassrooms.com/courses/deboguer-son-programme-avec-gdb|tuto sur openclassrooms, bien documenté]] | ||
+ | * (fr) [[https://devarea.developpez.com/dix-choses-faisables-avec-GDB/|Dix choses qu'on ne peut faire qu'avec GDB]] | ||
+ | * (fr) [[http://www.linux-france.org/article/devl/gdb.html|Utilisation de gdb-mode sous Emacs sur linux-france.org]] | ||
+ | * (en) [[http://www.gnu.org/software/ddd/|Le site de ddd (interface graphique pour debuggers dont gdb)]] | ||
+ | * (en) [[http://cgdb.sourceforge.net/|Le site de cgdb]] |