Wie kann ein GDB-Haltepunkt erst dann unterbrochen werden, wenn der Punkt eine bestimmte Anzahl von Malen erreicht hat?

85

Ich habe eine Funktion, die einige Male aufgerufen wird und schließlich Fehler verursacht.

Ich möchte jedoch keinen Haltepunkt für diese Funktion festlegen und nach jedem Aufruf anhalten, da ich jahrelang hier sein werde.

Ich habe gehört, dass ich counterin GDB einen Haltepunkt setzen kann, und jedes Mal, wenn der Haltepunkt erreicht wird, wird der Zähler dekrementiert und nur ausgelöst, wenn counter= 0.

Ist das richtig und wenn ja, wie mache ich das? Bitte geben Sie den GDB-Code zum Setzen eines solchen Haltepunkts an.

Tony Stark
quelle
1
Zu
Ihrer Information,

Antworten:

160

Lesen Sie Abschnitt 5.1.6 des GDB-Handbuchs. Was Sie tun müssen, ist zuerst einen Haltepunkt festzulegen und dann einen 'Ignorierzähler' für diese Haltepunktnummer festzulegen, z ignore 23 1000.

Wenn Sie nicht wissen, wie oft Sie den Haltepunkt ignorieren sollen, und nicht manuell zählen möchten, kann Folgendes hilfreich sein:

  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
Kilian Foth
quelle
13

continue <n>

Dies ist eine bequeme Methode, die die Haltepunktzeiten der letzten Treffer überspringt n - 1(und daher beim n-ten Treffer stoppt):

Haupt c

#include <stdio.h>

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

Verwendung:

gdb -n -q main.out

GDB-Sitzung:

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).
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle