किसी दिए गए नंबर पर बिंदु तक पहुँचने के बाद केवल GDB ब्रेकपॉइंट कैसे बनाया जाता है?


85

मेरे पास एक फ़ंक्शन है जिसे कुछ बड़ी संख्या में बार-बार कहा जाता है, और अंततः सेगफॉल्ट्स।

हालाँकि, मैं इस फ़ंक्शन पर एक ब्रेकपॉइंट सेट नहीं करना चाहता हूं और हर बार कॉल करने के बाद रुक जाता हूं, क्योंकि मैं यहां वर्षों तक रहूंगा।

मैंने सुना है कि मैं counterएक ब्रेकपॉइंट के लिए GDB में सेट कर सकता हूं , और हर बार जब ब्रेकपॉइंट मारा जाता है, काउंटर को डिक्रिप्ट किया जाता है, और केवल counter= 0 होने पर ट्रिगर हो जाता है ।

क्या यह सही है, और यदि ऐसा है तो मैं इसे कैसे करूं? कृपया इस तरह के ब्रेकपॉइंट को सेट करने के लिए gdb कोड दें।


1
FYI करें इसे सशर्त विराम बिंदु कहा जाता है
sakisk

जवाबों:


162

GDB मैनुअल का खंड 5.1.6 पढ़ें । आपको जो करना है, पहले एक ब्रेकपॉइंट सेट करें, फिर उस ब्रेकपॉइंट संख्या के लिए एक 'इग्नोर काउंट' सेट करें, जैसे 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

13

continue <n>

यह एक सुविधाजनक तरीका है जो आखिरी हिट ब्रेकप्वाइंट n - 1समय को छोड़ देता है (और इसलिए एन-वें हिट पर रुक जाता है):

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).
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.