Как сделать точку останова GDB только после того, как точка будет достигнута заданное число раз?


у меня есть функция, которая вызывается некоторое большое количество раз, и в конечном итоге segfaults.

однако я не хочу устанавливать точку останова в этой функции и останавливаться после каждого ее вызова, потому что я буду здесь в течение многих лет.

Я слышал, что я могу установить counter в GDB для точки останова, и каждый раз, когда точка останова попадает, счетчик уменьшается и срабатывает только тогда, когда counter = 0.

это точно, и если да, то как мне это сделать это? Пожалуйста, дайте код gdb для установки такой точки останова.

2 69

2 ответа:

читать 5.1.6 руководства GDB. То, что вам нужно сделать, это сначала установить точку останова, а затем установить "игнорировать счетчик" для этого номера точки останова, например ignore 23 1000.

Если вы не знаете, сколько раз игнорировать точку останова, и не хотите считать вручную, может помочь следующее:

  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

continue <n>

это удобный метод, который пропускает последнее попадание точки останова n - 1 раза:

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
 = 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).