Làm thế nào để làm cho điểm ngắt GDB chỉ ngắt sau khi điểm đạt đến một số lần nhất định?


85

Tôi có một hàm được gọi là một số lần lớn và cuối cùng là mặc định.

Tuy nhiên, tôi không muốn đặt điểm ngắt tại chức năng này và dừng lại sau mỗi lần nó được gọi, bởi vì tôi sẽ ở đây trong nhiều năm.

Tôi nghe nói rằng tôi có thể đặt một countertrong GDB cho một điểm ngắt và mỗi khi điểm ngắt được nhấn, bộ đếm sẽ giảm đi và chỉ được kích hoạt khi counter= 0.

Điều này có chính xác không, và nếu có thì tôi phải làm như thế nào? Vui lòng cung cấp mã gdb để đặt điểm ngắt như vậy.


1
FYI này được gọi là một breakpoint có điều kiện
sakisk

Câu trả lời:


162

Đọc phần 5.1.6 của sổ tay GDB. Những gì bạn phải làm trước tiên là đặt một điểm ngắt, sau đó đặt 'số lượng bỏ qua' cho số điểm ngắt đó, ví dụ ignore 23 1000.

Nếu bạn không biết bao nhiêu lần bỏ qua điểm ngắt và không muốn đếm theo cách thủ công, thì những điều sau có thể hữu ích:

  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>

Đây là một phương pháp thuận tiện bỏ qua n - 1thời gian điểm ngắt lần truy cập cuối cùng (và do đó dừng lại ở lần truy cập thứ n):

C chính

#include <stdio.h>

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

Sử dụng:

gdb -n -q main.out

Phiên 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).
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.