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

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

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

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

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


person Tony Stark    schedule 02.06.2010    source источник
comment
К вашему сведению, это называется условной точкой останова   -  person sakisk    schedule 16.09.2013


Ответы (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
person Kilian Foth    schedule 02.06.2010

continue <n>

Это удобный метод, который пропускает точку останова по последнему попаданию n - 1 раз (и, следовательно, останавливается на n-м попадании):

main.c

#include <stdio.h>

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

Использование:

gdb -n -q main.out

Сессия 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).
person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 16.09.2017