Les points d'arrêt
Les breakpoints permettent d'interrompre l'exécution du programme à des emplacements spécifiques du code.
- break <fonction> — Suspend l'exécution à l'entrée d'une fonction donnée
- break <numero_ligne> — Suspend l'exécution à un numéro de ligne précis
- break +/-decalage — Suspend l'exécution à une distance relative de la ligne actuelle (decalage étant un entier positif)
- break fichier:numero_ligne — Suspend l'exécution à une ligne spécifique d'un fichier source
- break ... if <condition> — Suspend l'exécution uniquement lorsque la condition est vraie. Par exemple, dans une boucle:
break if compteur==50arrêtera le programme lorsque la variable compteur atteint 50
Exemple d'utilisation:
(gdb) break utils_parser.cpp:128
Breakpoint 3 at 0x565f8a: file utils_parser.cpp, line 128.
Opérations sur les breakpoints
- delete — Supprime tous les points d'arrêt
- delete breakpoint [n] — Supprime un breakpoint spécifique
- disable breakpoint [n] — Désactive un breakpoint sans le supprimer
- enable breakpoitn [n] — Active un breakpoint précédemment désactivé
- info breakpoints [n] — Affiche les informations sur les breakpoints existants
Les points d'observation
Les watchpoints (points d'observation) permettent de capturer des événements lors de l'exécution: chargement de bibliothèques dynamiques, exceptions C++, etc. Ils sont particulièrement utiles pour identifier la source des bogues.
- watch <expression> — Interrompt l'exécution lorsque la valeur de la variable change
- rwatch <expression> — Interrompt l'exécution lorsque la variable est lue
- awatch <expression> — Interrompt l'exécution lors de toute lecture ou écriture de la variable
La commande info watchpoints [n] affiche l'état actuel des points d'observation.
Examen des variables
La méthode la plus courante pour inspecter une variable:
(gdb) print compteur
$1 = 42
Par défaut, l'affichage des tableaux peut être tronqué. Pour configurer le nombre maximal d'éléments affichés:
(gdb) set print elements 500
Consultation du code source pendant le débogage
- list fonction — Affiche le code autour d'une fonction (ex:
list initialiser) - list fichier:fonction — Affiche le code d'une fonction dans un fichier spécifique (ex:
list config_loader.c:initialiser) - list n1,n2 — Affiche les lignes spécifiques du fichier courant (ex:
list 15,35)
Pour une expérience plus visuelle, il est possible de lancer GDB en mode TUI:
gdb -tui nom_executable
Ou passer en mode TUI après le lancement avec la comande focus.
Contrôle d'exécution et exécution pas à pas
- continue — Reprend l'exécution jusqu'au prochain breakpoint (équivalent de F5 dans Visual Studio)
- next — Exécution pas à pas sans entrer dans les fonctions (équivalent de F10)
- step — Exécution pas à pas en entrant dans les sous-fonctions (équivalent de F11)
- until — Exécute le programme jusqu'à la sortie du bloc courant
- finish — Termine la fonction en cours et retourne au niveau supérieur, en affichant la valeur de retour
Analyse de la pile d'exécution avec backtrace
Lorsqu'un programme s'arrête, il est essentiel de identifier l'emplacement precisaù l'exécution a été suspendue. Lorsqu'une fonction est appelée, son adresse, ses paramètres et ses variables locales sont empilés dans la pile (stack). La commande backtrace (ou simplement bt) affiche le contenu actuel de la pile d'appel:
(gdb) bt
#0 traiter_requete (donnees=0x7fff5a3c) at handler.c:45
#1 0x0000555555554a2c in main () at main.c:102
Points d'arrêt dans un thread spécifique
Il est possible de définir des breakpoints applicables à tous les threads ou uniquement à un thread particulier:
- break <lignespec> thread <id_thread>
- break <lignespec> thread <id_thread> if <condition>
Le paramètre lignespec indique la ligne source, et id_thread correspond à l'identifiant attribué par GDB. Pour obtenir la liste des threads en cours d'exécution:
(gdb) info threads
Sans spécifier de thread, le breakpoint s'applique à tous les threads. Example:
(gdb) break parser.c:42 thread 15 if donnees.validation == 0
Lors d'un arrêt, tous les threads sont suspendus pour faciliter l'analyse globale. Lorsque l'exécution reprend, tous les threads reprennent simultanément, y compris pendant le débogage pas à pas.
Autres commandes utiles
- x/10x $sp — Affiche les 10 premiers éléments de la pile
- info frame — Informations générales sur le frame courant
- info args — Liste les arguments de la fonction en cours
- info locals — Affiche les variables locales du frame
- info registers — Valeurs des registres (hors registres flottants)
- info all-registers —Valeurs de tous les registres, y compris les flottants
- info catch — Affiche les gestionnaires d'exceptions du frame courant