GDB: ngắt nếu biến có giá trị bằng


89

Tôi muốn đặt GDB một điểm ngắt khi một biến bằng một số giá trị tôi đã đặt, tôi đã thử ví dụ sau:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Đầu ra từ GDB:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Như bạn thấy, GDB đã không tạo ra bất kỳ điểm đột phá nào, liệu điều này có thể xảy ra với GDB không?

Câu trả lời:


123

Ngoài một điểm giám sát được lồng bên trong một điểm ngắt, bạn cũng có thể đặt một điểm ngắt duy nhất trên 'filename: line_number' và sử dụng một điều kiện. Tôi thấy nó đôi khi dễ dàng hơn.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Nếu giống như tôi, bạn cảm thấy mệt mỏi với việc thay đổi số dòng, bạn có thể thêm một nhãn rồi đặt điểm ngắt trên nhãn như sau:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

30

Bạn có thể sử dụng một điểm giám sát cho việc này (Một điểm ngắt trên dữ liệu thay vì mã).

Bạn có thể bắt đầu bằng cách sử dụng watch i.
Sau đó, đặt một điều kiện cho nó bằng cách sử dụngcondition <breakpoint num> i == 5

Bạn có thể lấy số điểm ngắt bằng cách sử dụng info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
Bạn phải ở một nơi trong mã nơi itồn tại. Hãy thử break main, run, c, s(bước để đảm bảo bạn sẽ có được qua việc kê khai), và sau đó các lệnh trên câu trả lời. Đảm bảo biên dịch chương trình của bạn với -gcờ. (tức là với thông tin gỡ lỗi)
imreal

Trước khi bắt đầu thực thi, các đơn vị / tệp biên dịch khác được liên kết với tệp thực thi chính của bạn có thể chưa được tải. Một lựa chọn tiện lợi là để sử dụng sau đó start <args>, mà là giống như tb main, run <args>. Thao tác này sẽ khởi động chương trình, cho phép bạn đặt điểm ngắt / xem dễ dàng hơn.
JWCS

9

Đầu tiên, bạn cần biên dịch mã của mình với các cờ thích hợp, cho phép gỡ lỗi thành mã.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

sau đó chỉ cần chạy mã của bạn với trình gỡ lỗi yêu thích của bạn

$ gdb ./ex1

cho tôi xem mã.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

ngắt trên dòng 5 và xem nếu i == 5.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

kiểm tra các điểm ngắt

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

chạy chương trình

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

4

Có các điểm giám sát phần cứng và phần mềm. Chúng dùng để đọc và ghi một biến. Bạn cần tham khảo một bài hướng dẫn:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Để đặt điểm theo dõi, trước tiên bạn cần ngắt mã vào một nơi mà biến thể i hiện diện trong môi trường và đặt điểm theo dõi.

watchlệnh được sử dụng để thiết lập một canh gác để ghi, trong khi rwatchđọc và awatchđể đọc / ghi.

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.