¿Cómo hacer que un punto de ruptura de GDB solo se rompa después de que se alcance un número determinado de veces?

85

Tengo una función que se llama una gran cantidad de veces y, finalmente, segfaults.

Sin embargo, no quiero establecer un punto de interrupción en esta función y detenerme cada vez que se llama, porque estaré aquí durante años.

Escuché que puedo establecer un counteren GDB para un punto de interrupción, y cada vez que se alcanza el punto de interrupción, el contador disminuye y solo se activa cuando counter= 0.

¿Es esto exacto y, de ser así, cómo lo hago? Proporcione el código gdb para establecer dicho punto de interrupción.

Tony Stark
fuente
1
Para su información, esto se llama un punto de interrupción condicional
sakisk

Respuestas:

162

Lea la sección 5.1.6 del manual de GDB. Lo que debe hacer primero es establecer un punto de interrupción, luego establecer un 'recuento de ignorar' para ese número de punto de interrupción, por ejemplo ignore 23 1000.

Si no sabe cuántas veces debe ignorar el punto de interrupción y no desea contar manualmente, lo siguiente puede ayudar:

  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
fuente
13

continue <n>

Este es un método conveniente que omite los n - 1tiempos de interrupción del último hit (y por lo tanto se detiene en el n-ésimo hit):

C Principal

#include <stdio.h>

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

Uso:

gdb -n -q main.out

Sesión del BGF:

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