Gdb est un outil essentiel pour déboguer les programmes C.
Les points d'arrêt sont le moyen de dire à GDB d'arrêter ou de mettre en pause l'exécution du programme à certaines lignes, fonctions ou adresses. Une fois le programme arrêté, vous pouvez examiner et modifier les valeurs des variables, poursuivre l'exécution du programme à partir de ce point d'arrêt, etc.
Si vous débutez avec GDB, vous devez d'abord comprendre les bases du débogage du C programme utilisant GDB.
Ce didacticiel utilisera le code suivant pour décrire le point d'arrêt gdb avec des exemples.
#include <stdio.h> int power(int,int); int main() { int i; printf("Program to calculate power\n"); for (i=0;i<10;i++) printf("%d %d\n",i, power(2,i)); return 0; } int power (int base, int n) { int i,p; p=1; for (i=1; i<=n; i++) p = p*base; return p; } # cc -g power.c
Vous avez maintenant un exécutable qui calcule la puissance de la base 2 de 0 à 9.
1. Comment définir un point d'arrêt à la fonction
# gdb (gdb) file ./a.out Reading symbols from /home/lakshmanan/a.out...done. (gdb) b power Breakpoint 1 at 0x40055d: file power.c, line 16. (gdb) run Starting program: /home/lakshmanan/./a.out Program to calculate power Breakpoint 1, power (base=2, n=0) at power.c:17 17 p=1;
Nous fixons un point d'arrêt à la puissance de la fonction et nous exécutons le programme. Le programme continuera son exécution jusqu'à l'appel de la fonction à power(). Une fois la fonction rencontrée, le programme s'arrêtera.
2. Obtenir les informations sur les arguments passés à une fonction
Pour connaître les arguments passés à la fonction, utilisez "info args".
(gdb) info args base = 2 n = 0
3. Obtenir les informations sur les variables locales
Pour connaître les informations sur les variables locales accessibles au sein de cette fonction (stack frame courant) utilisez ‘info locals’.
(gdb) info locals i = 32767 p = -7840
4. Continuer l'exécution du programme jusqu'au prochain point d'arrêt
Pour continuer le programme jusqu'au prochain point d'arrêt, utilisez "continuer".
(gdb) continue Continuing. 0 1 Breakpoint 1, power (base=2, n=1) at power.c:16 16 int i=0,p=1;
Une fois que nous avons donné "continuer", la fonction de puissance a été exécutée et a imprimé le résultat. La même fonction d'alimentation a été appelée à nouveau depuis la boucle for 'main()', de sorte que le programme s'est arrêté une fois de plus.
5. Obtenir des informations sur tous les points d'arrêt
Vous pouvez obtenir des informations sur les points d'arrêt à l'aide des "points d'arrêt d'informations".
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005a7 in power at power.c:16 breakpoint already hit 2 times
Maintenant, nous avons défini un seul point d'arrêt et les informations concernant les points d'arrêt sont affichées.
6. Supprimer un point d'arrêt existant
Pour supprimer un point d'arrêt existant, utilisez "supprimer les points d'arrêt"
(gdb) delete breakpoints 1 (gdb) info breakpoints No breakpoints or watchpoints.
Nous avons maintenant supprimé le point d'arrêt qui était présent dans la fonction d'alimentation.
7. Définir un point d'arrêt temporaire
Parfois, vous voudrez peut-être arrêter le programme à un moment donné une seule fois. Vous pouvez utiliser des points d'arrêt temporaires pour cela. Un point d'arrêt temporaire n'arrête le programme qu'une seule fois, puis il sera supprimé.
(gdb) tbreak power Temporary breakpoint 3 at 0x4005a7: file power.c, line 16. (gdb) info breakpoints Num Type Disp Enb Address What 3 breakpoint del y 0x00000000004005a7 in power at power.c:16 (gdb) continue Continuing. 1 2 Temporary breakpoint 3, power (base=2, n=2) at power.c:16 16 int i=0,p=1; (gdb) info breakpoints No breakpoints or watchpoints.