web-dev-qa-db-fra.com

GDB: break si variable égale valeur

J'aime faire en sorte que GDB définisse un point de rupture lorsqu'une variable é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 pause, est-ce possible avec GDB?

79
SIFE

en plus d'un point de contrôle imbriqué dans un point d'arrêt, vous pouvez également définir un seul point d'arrêt sur le 'nom de fichier: numéro_ligne' et utiliser une condition. Je trouve ça 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 des changements de numéros de ligne, vous pouvez ajouter une étiquette, puis définir le point d'arrêt sur l'étiquette de la manière suivante:

#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
114
matt

Vous pouvez utiliser un point de contrôle à cet effet (point d'arrêt sur des données au lieu de code).

Vous pouvez commencer par utiliser watch i.
Puis définissez une condition pour cela en utilisant condition <breakpoint num> i == 5

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

27
imreal

Tout d'abord, vous devez compiler votre code avec les indicateurs appropriés pour activer le débogage en code.

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

ensuite, lancez simplement votre code avec votre débogueur préféré

$ gdb ./ex1

montre 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)
8
Alexandre Mulatinho

Il existe des points de contrôle matériels et logiciels. Ils sont destinés à 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, vous devez commencer par insérer le code dans un emplacement où le varianle i est présent dans l'environnement et définir le point de surveillance.

La commande watch permet de définir un watchpoit en écriture, tandis que rwatch en lecture et awatch en lecture/écriture.

4
alinsoar