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