Come fare in modo che un punto di interruzione GDB si interrompa solo dopo che il punto è stato raggiunto un determinato numero di volte?


85

Ho una funzione che viene chiamata un gran numero di volte e alla fine va in errore.

Tuttavia, non voglio impostare un punto di interruzione in questa funzione e fermarmi dopo ogni volta che viene chiamata, perché sarò qui per anni.

Ho sentito che posso impostare un counterin GDB per un punto di interruzione e ogni volta che viene raggiunto il punto di interruzione, il contatore viene decrementato e viene attivato solo quando counter= 0.

È accurato e, in caso affermativo, come lo faccio? Fornisci il codice gdb per impostare un tale punto di interruzione.


1
Cordiali saluti, questo è chiamato un punto di interruzione condizionale
sakisk

Risposte:


162

Leggere la sezione 5.1.6 del manuale GDB. Quello che devi fare è prima impostare un punto di interruzione, quindi impostare un 'ignora conteggio' per quel numero di punto di interruzione, ad es ignore 23 1000.

Se non sai quante volte ignorare il punto di interruzione e non vuoi contare manualmente, potrebbe essere utile quanto segue:

  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

13

continue <n>

Questo è un metodo conveniente che salta i n - 1tempi di breakpoint dell'ultimo hit (e quindi si ferma all'n-esimo hit):

main.c

#include <stdio.h>

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

Utilizzo:

gdb -n -q main.out

Sessione 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).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.