web-dev-qa-db-fra.com

Comment faire pour qu'un point d'arrêt GDB ne se brise qu'après avoir atteint un certain nombre de fois le point?

J'ai une fonction qui est appelée un grand nombre de fois, et éventuellement des erreurs de segmentation.

Cependant, je ne veux pas définir de point d'arrêt à cette fonction et m'arrêter après chaque appel, car je serai ici pendant des années.

J'ai entendu dire que je peux définir un counter dans GDB pour un point d'arrêt, et chaque fois que le point d'arrêt est atteint, le compteur est décrémenté et n'est déclenché que lorsque le counter = 0.

Est-ce exact, et si oui, comment dois-je procéder? Veuillez donner le code gdb pour définir un tel point d'arrêt.

76
Tony Stark

Lisez section 5.1.6 du manuel GDB. Ce que vous devez faire est d'abord de définir un point d'arrêt, puis de définir un `` compte d'ignorer '' pour ce numéro de point d'arrêt, par ex. ignore 23 1000.

Si vous ne savez pas combien de fois ignorer le point d'arrêt et que vous ne voulez pas compter manuellement, les éléments suivants peuvent vous aider:

  ignore 23 1000000   # set ignore count very high.

  run                 # the program will SIGSEGV before reaching the ignore count.
                      # Once it stops with SIGSEGV:

  info break 23       # tells you how many times the breakpoint has been hit, 
                      # which is exactly the count you want
146
Kilian Foth

continue <n>

Il s'agit d'une méthode pratique qui ignore le dernier point d'arrêt atteint n - 1 fois:

gdb -n -q tmp.out
Reading symbols from tmp.out...done.
(gdb) l
1       #include <stdio.h>
2
3       int main(void) {
4           int i = 0;
5           while (1) {
6               i++;
7               printf("%d\n", i);
8           }
9       }
(gdb) start
Temporary breakpoint 1 at 0x6a8: file tmp.c, line 4.
Starting program: /home/ciro/bak/git/cpp-cheat/gdb/tmp.out

Temporary breakpoint 1, main () at tmp.c:4
4           int i = 0;
(gdb) b 6
Breakpoint 2 at 0x5555555546af: file tmp.c, line 6.
(gdb) c
Continuing.

Breakpoint 2, main () at tmp.c:6
6               i++;
(gdb) c 5
Will ignore next 4 crossings of breakpoint 2.  Continuing.
1
2
3
4
5

Breakpoint 2, main () at tmp.c:6
6               i++;
(gdb) p i
$1 = 5
(gdb)
(gdb) help c
Continue program being debugged, after signal or breakpoint.
Usage: continue [N]
If proceeding from breakpoint, a number N may be used as an argument,
which means to set the ignore count of that breakpoint to N - 1 (so that
the breakpoint won't break until the Nth time it is reached).