Как заставить точку останова GDB ломаться только после того, как точка достигнет заданного числа раз?
У меня есть функция, которая называется большим количеством раз, и в конечном итоге segfaults.
Однако я не хочу устанавливать контрольную точку в этой функции и останавливаться после каждого ее вызова, потому что я буду здесь годами.
Я слышал, что я могу установить counter
в GDB для точки останова, и каждый раз, когда точка останова ударяется, счетчик уменьшается и запускается только тогда, когда counter
= 0.
Является ли это точной, и если да, то как мне это сделать? Пожалуйста, дайте код gdb для установки такой точки останова.
Ответы
Ответ 1
Прочтите раздел 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
Ответ 2
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).