如何使一个广义数据库断点只有在达到一个给定的数量的时候才中断?

我有一个函数,它被调用了大量次数,最终发生了分段错误。

但是,我不想在这个函数上设置一个断点,并在每次调用之后停止,因为我将在这里停留数年。

我听说我可以在 GDB 中为一个断点设置一个 counter,并且每次命中断点时,计数器都会减少,只有当 counter = 0时才会触发。

这是准确的吗? 如果是的话,我该怎么做?请给出设置这种断点的 gdb 代码。

43688 次浏览

Read section 5.1.6 of the GDB manual. What you have to do is first set a breakpoint, then set an 'ignore count' for that breakpoint number, e.g. ignore 23 1000.

If you don't know how many times to ignore the breakpoint, and don't want to count manually, the following may help:

  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>

This is a convenient method that skips the last hit breakpoint n - 1 times (and therefore stops at the n-th hit):

main.c

#include <stdio.h>


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

Usage:

gdb -n -q main.out

GDB session:

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