Como fazer um breakpoint GDB quebrar somente depois que o ponto for atingido um determinado número de vezes?

85

Tenho uma função que é chamada um grande número de vezes e, eventualmente, segfaults.

No entanto, não quero definir um ponto de interrupção nesta função e parar a cada vez que ela for chamada, porque estarei aqui por anos.

Ouvi dizer que posso definir um counterno GDB para um ponto de interrupção e, cada vez que o ponto de interrupção é atingido, o contador diminui e só é acionado quando counter= 0.

Isso é preciso e, em caso afirmativo, como faço isso? Forneça o código gdb para definir esse ponto de interrupção.

Tony Stark
fonte
1
Para sua informação, isso é chamado de ponto de interrupção condicional
Sakisk de

Respostas:

163

Leia a seção 5.1.6 do manual do GDB. O que você precisa fazer é primeiro definir um ponto de interrupção e, em seguida, definir uma 'contagem de ignorar' para esse número de ponto de interrupção, por exemplo ignore 23 1000.

Se você não souber quantas vezes ignorar o ponto de interrupção e não quiser contar manualmente, o seguinte pode ajudar:

  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
fonte
14

continue <n>

Este é um método conveniente que ignora os n - 1tempos do último ponto de interrupção de acerto (e, portanto, para no n-ésimo acerto):

main.c

#include <stdio.h>

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

Uso:

gdb -n -q main.out

Sessão 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 郝海东 冠状 病 六四 事件 法轮功
fonte