109 votes

GDB : rupture si la variable est égale à la valeur

J'aime faire en sorte que GDB définisse un point d'arrêt lorsqu'une variable est égale à une valeur que j'ai définie, j'ai essayé cet exemple :

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Sortie de GDB :

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Comme vous le voyez, GDB n'a pas fait de point d'arrêt, est-ce possible avec GDB ?

149voto

matt Points 1608

En plus d'un point de surveillance imbriqué à l'intérieur d'un point d'arrêt vous pouvez également définir un point d'arrêt unique sur le "nom de fichier:numéro de ligne" et utiliser une condition. Je trouve cela parfois plus facile.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Si comme moi vous en avez assez de voir les numéros de ligne changer, vous pouvez ajouter une étiquette puis fixer le point d'arrêt sur l'étiquette comme suit :

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

38voto

imreal Points 5984

Vous pouvez utiliser un point de surveillance pour cela (un point d'arrêt sur les données au lieu du code).

Vous pouvez commencer par utiliser watch i .
Définissez ensuite une condition à l'aide de condition <breakpoint num> i == 5

Vous pouvez obtenir le numéro du point d'arrêt en utilisant info watch

10voto

mulatinho Points 39

Tout d'abord, vous devez compiler votre code avec les drapeaux appropriés, permettant le débogage dans le code.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

puis exécutez votre code avec votre débogueur préféré.

$ gdb ./ex1

Montrez-moi le code.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

pause sur les lignes 5 et regarde si i == 5.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

vérification des points d'arrêt

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

exécuter le programme

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

4voto

alinsoar Points 3583

Il existe des points de surveillance matériels et logiciels. Ils servent à la lecture et à l'écriture d'une variable. Vous devez consulter un tutoriel :

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Pour définir un point de surveillance, il faut d'abord casser le code à un endroit où la variante i est présente dans l'environnement, et définir le point de surveillance.

watch est utilisée pour définir un point de surveillance pour l'écriture, tandis que la commande rwatch pour la lecture, et awatch pour la lecture/écriture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X