2012-04-16 40 views
7

Tôi đang sử dụng gdb-7.0.1 và tôi nghĩ rằng mình đã phát hiện lỗi trong một phần nhất định của mã của tôi, trong đó có vòng lặp for. Vòng lặp for trông giống nhưTiếp tục lặp lại trong C++ cho đến khi một số lặp cụ thể trong gdb

for (int i=0 ; i< end ; ++i) 
{ 
    //Code here. 
} 

Đây end là một số nguyên rất lớn. Mã không bị lỗi ở lần lặp đầu tiên và dường như gặp sự cố ở số lặp end/2.

Vì tôi muốn hiểu hành vi của mã tại số lặp end/2, chỉ cần steppingnexting từ i=0 cho đến khi tôi đạt đến điểm lặp này, không khả thi.

Có cách nào để yêu cầu gdb tiếp tục qua vòng lặp cho đến khi i nhận giá trị end/2 và sau đó chờ người dùng tự thực hiện qua số lặp end/2?

Tôi đang sử dụng gcc-4.5.2 trên Ubuntu Linux

+0

http://blog.vinceliu.com/2009/07/gdbs-conditional-breakpoints.html –

Trả lời

5

Khi bạn đặt điểm ngắt, nó sẽ cung cấp cho bạn một số điểm dừng (cho thời điểm này, giả sử nó là 1). Sau đó, bạn sẽ làm cho điểm ngắt đó có điều kiện, giống như:

condition 1 i==end/2 
1

Bạn sẽ có thể đặt một if (i == (end/2 -1)) { Foo; } trong đó sau đó thiết lập một breakpoint tại Foo, mà sẽ cho phép bạn tiếp tục đẩy mạnh từ đó.

+0

+1 vì đây là phương pháp của tôi cho đến khi tôi tìm thấy điểm ngắt có điều kiện như @LuchianGrigore đề xuất. –

+0

Cảm ơn vâng, tôi không đủ thông thạo gdb để chọn nó. Tôi đã tìm ra nó là một giải pháp đủ để loại bỏ nó ngay cả khi đối mặt với những người sâu sắc hơn. –

6

Đây là hướng dẫn về conditional breakpoints với gdb.

Tôi đoán bạn không biết thuật ngữ này, nếu không nó sẽ dễ dàng với google.

+0

Một giải pháp thay thế khác là '(gdb) bỏ qua end/2-1' –

5

Bạn phải sử dụng điểm ngắt có điều kiện. Dưới đây là thêm về nó: http://www.cs.cmu.edu/~gilpin/tutorial/#3.4

Và trên SO: How do I set a conditional breakpoint in gdb, when char* x points to a string whose value equals "hello"?

Trong trường hợp của bạn (không kiểm tra):

break <line_number> if i==end/2 
+0

Tôi có thể xác nhận rằng đây là cách để đi. Tôi sử dụng gdb tất cả các thời gian ... –

1

Nếu end là lớn (lên tới hàng chục ngàn), thì có điều kiện giải pháp breakpoint có thể rất chậm - gdb phải đánh giá điều kiện mỗi lần vòng lặp. Nếu đây là một vấn đề cho bạn, sau đó bạn có thể sử dụng thủ thuật này:

for (int i=0 ; i< end ; ++i) 
{ 
    if (i == end/2) 
     i %= end ; // This has no effect, but lets you set a breakpoint here 
    //Code here. 
} 

Tôi làm điều này tất cả các thời gian :-)

Một giải pháp khác là để thiết lập một bỏ qua đếm trên breakpoint. Tôi sử dụng gdb trong môi trường Qt, vì vậy tôi không thể cung cấp cho bạn cú pháp gdb. Nhưng nó nhanh hơn thiết lập một điều kiện.

Các vấn đề liên quan