Comment faire en sorte qu'un point d'arrêt GDB ne casse qu'après avoir atteint un certain nombre de fois?

85

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

Cependant, je ne veux pas définir un 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 pouvais définir un counterdans 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 puis-je le faire? Veuillez donner le code gdb pour définir un tel point d'arrêt.

Tony Stark
la source
1
Pour info, cela s'appelle un point d'arrêt conditionnel
sakisk

Réponses:

163

Lisez la 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 exemple ignore 23 1000.

Si vous ne savez pas combien de fois ignorer le point d'arrêt et que vous ne souhaitez pas compter manuellement, ce qui suit peut 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
Kilian Foth
la source
13

continue <n>

C'est une méthode pratique qui ignore les n - 1heures du dernier point d'arrêt de hit (et s'arrête donc au n-ième hit):

principal c

#include <stdio.h>

int main(void) {
    int i = 0;
    while (1) {
        i++; /* Line 6 */
        printf("%d\n", i);
    }
}

Usage:

gdb -n -q main.out

Session GDB:

Reading symbols from main.out...done.
(gdb) start
Temporary breakpoint 1 at 0x6a8: file main.c, line 4.
Starting program: /home/ciro/bak/git/cpp-cheat/gdb/main.out

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

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

Breakpoint 2, main () at main.c:6
6               i++; /* Line 6 */
(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).
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
la source