Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
gdb [Le 08/07/2007, 16:25]
thedamocles Liens accéssibles
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 
  
 +==== Pour Vim/GVim ====
 +  * [[https://​github.com/​larrupingpig/​vimgdb-for-vim7.4|VimGDB]]
 +  * [[https://​www.vim.org/​scripts/​script.php?​script_id=4582|Conque GDB]]
 +  * [[https://​sourceforge.net/​projects/​clewn|Clewn]]
 +
 +==== Pour IDE ====
 +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 ===== ===== Liens =====
-   * [[http://​sourceware.org/​gdb/​documentation/​|La documentation officielle]] ​; +   ​* ​(en) [[http://​sourceware.org/​gdb/​documentation/​|La documentation officielle]] 
-   * [[http://​www.linux-france.org/​article/​devl/​gdb_howto.html|Un tutorial]] ​; +   ​* ​(fr) [[http://​www.linux-france.org/​article/​devl/​gdb_howto.html|Un tutorial ​simple sur linux-france.org]] 
-   * [[http://www.gnu.org/software/ddd/|Le site de ddd]] ; +   ​* ​(fr) [[https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/​gdb.html|tuto de Anne Canteaut de l'​INRIA,​ bien documenté]] 
-   * [[http://cgdb.sourceforge.net/|Le site de cgdb]] ; +   ​* ​(fr) [[https://openclassrooms.com/​courses/​deboguer-son-programme-avec-gdb|tuto sur openclassrooms,​ bien documenté]] 
-   * [[http://​www.linux-france.org/​article/​devl/​gdb.html|Utilisation de gdb-mode]] ​; +   * (fr) [[https://​devarea.developpez.com/​dix-choses-faisables-avec-GDB/|Dix choses qu'on ne peut faire qu'​avec GDB]] 
-   * [[http://refcards.com/docs/peschr/gdb/gdb-refcard-a4.pdf|Carte de référence]].+   ​* ​(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]]
  • gdb.1183904749.txt.gz
  • Dernière modification: Le 18/04/2011, 14:40
  • (modification externe)