วิธีทำให้เบรกพอยต์ GDB แตกหลังจากจุดถึงจำนวนครั้งที่กำหนดเท่านั้น?


85

ฉันมีฟังก์ชันที่ถูกเรียกใช้เป็นจำนวนมากและในที่สุดก็แยกกัน

อย่างไรก็ตามฉันไม่ต้องการตั้งเบรกพอยต์ที่ฟังก์ชันนี้และหยุดทุกครั้งที่เรียกเพราะฉันจะอยู่ที่นี่เป็นเวลาหลายปี

ฉันได้ยินมาว่าฉันสามารถตั้งค่าcounterใน GDB สำหรับเบรกพอยต์ได้และทุกครั้งที่เบรกพอยต์ถูกตีตัวนับจะลดลงและจะถูกทริกเกอร์เมื่อcounter= 0 เท่านั้น

ข้อมูลนี้ถูกต้องหรือไม่และหากเป็นเช่นนั้นฉันจะทำอย่างไร โปรดให้รหัส gdb สำหรับการตั้งค่าเบรกพอยต์


1
FYI นี้เรียกว่าเบรกพอยต์แบบมีเงื่อนไข
sakisk

คำตอบ:


163

อ่านส่วน 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

14

continue <n>

นี่เป็นวิธีที่สะดวกในการข้ามครั้งสุดท้ายของ Hit เบรกพอยต์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).
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.