GDB: break si variable égale valeur


89

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

Réponses:


123

en plus d'un point de contrôle imbriqué dans un point d'arrêt, vous pouvez également définir un point d'arrêt unique sur le 'filename: line_number' 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 changer les numéros de ligne, vous pouvez ajouter une étiquette puis définir le point d'arrêt sur l'étiquette comme ceci:

#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

30

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

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

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


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
Vous devez être à un endroit du code où il iexiste. Essayez break main, run, c, s(pas pour vous assurer que vous avez passé la déclaration), puis les commandes sur la réponse. Assurez-vous de compiler votre programme avec l' -gindicateur. (ie avec des informations de débogage)
imreal

9

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

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

puis exécutez 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   }

break 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)

4

Il existe des points de surveillance matériels et logiciels. Ils servent à lire et à écrire une variable. Vous devez consulter un tutoriel:

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

Pour définir un point de surveillance, vous devez d'abord décomposer le code dans un endroit où le varianle i est présent dans l'environnement, et définir le point de surveillance.

watchLa commande est utilisée pour définir un point de surveillance pour l'écriture, pendant la rwatchlecture et awatchpour la lecture / l'écriture.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.