2011-10-16 28 views
10
if (true) { 
    String a = "foo"; 
    String b = "bar"; 
} 

Nếu tôi đặt một breakpoint tại String a = "foo"; nhật thực sẽ dừng lại, và tôi có thể bước qua và nhìn thấy giá trị của a bên trong cửa sổ biến. Nhưng tôi không thể bước qua tuyên bố thứ 2, nó chỉ rời khỏi khối mã và tôi không bao giờ thấy giá trị của b.Không thể breakpoint báo cáo kết quả cuối cùng của một khối mã trong Eclipse

Điều này buộc tôi thêm tuyên bố noop sau String b = "bar"; chỉ để tôi có thể xem nội dung b chứa. Tôi cũng không thể thêm điểm ngắt khi đóng } mà tôi cho rằng có thể là các vấn đề liên quan.

Tôi biết Visual Studio cho phép điều này, vì vậy có cách nào để thực hiện điều này trong Eclipse không?

+1

Bạn có hoàn toàn tích cực khi đang gỡ lỗi cùng phiên bản * của lớp học không? Ví dụ, tùy thuộc vào công cụ xây dựng của bạn, nếu bạn có nhiều dự án và chính của bạn nằm trong một dự án khác với nguồn này, nó có thể đang thực thi một bản sao cũ có các dòng mã khác nhau – Bohemian

+0

Ví dụ trên đã được kiểm tra và tôi chắc chắn của nó, bạn có thể thử nó cho mình. Đặt điểm ngắt trên 'String a =" foo ";' sử dụng F6 để bước qua, bạn sẽ thấy giá trị của 'a', sử dụng lại F6 và bạn sẽ nhảy ra khỏi khối mã. Bạn không bao giờ thấy giá trị của 'b' – rtaranu

+0

Bản sao của http://stackoverflow.com/questions/7785887/cant-breakpoint-the-last-statement-of-a-code-block-in-eclipse – Stefan

Trả lời

-1

Tôi thành thật không chắc chắn những gì đang xảy ra trong cài đặt Eclipse của bạn. Tôi đang làm việc trong Java và chỉ thử mọi thứ tôi có thể nghĩ đến. Tôi đã kiểm tra phương pháp tĩnh cho điểm ngắt trên dòng cuối cùng là không phải a } và nó hoạt động tốt. Tôi đã kiểm tra tương tự cho một phương pháp không tĩnh.

Nó phá vỡ theo cách này: bạn không thể phá vỡ trên một kết thúc cú đúp xoăn, nhưng nó sẽ mặc định bất cứ điều gì là dưới dấu ngoặc nhọn, dòng-khôn ngoan. Vì vậy, nếu bạn có một hàm lồng nhau:

public int DoesStuff(int x, int y) { 
    if(x > y) { 
     DoThing; 
    } 
    else { 
     DoOtherThing; 
    } 
} 

Sau đó hai niềng răng cuối cùng không thể phá vỡ-chỉ, nhưng DoThingDoOtherThing lon. Có lý?

+0

Tôi tin rằng những gì bạn nói là đúng, nhưng nó không trả lời câu hỏi. Vấn đề của anh ta dường như là câu lệnh cuối cùng * trước * dấu ngoặc kết thúc '}' không thể có điểm ngắt và bị bỏ qua khi bước qua. – Rob

+0

Tôi có thể phá vỡ 'DoThing' hoặc' DoOtherThing', để dừng trước khi hàm thực thi. Nhưng nếu các hàm đó trả về một giá trị được gán cũ: 'int myInt = DoThing()' và tôi bước qua nó, tôi không thể thấy giá trị được gán cho 'myInt'. "Break" tiếp theo sẽ ở bên ngoài khối mã. – rtaranu

+1

@Duckies Trên thực tế bạn * có thể * breakpoint trên một phương pháp đóng ngoặc nhọn - xem câu trả lời của tôi. –

4

Bạn có thể đánh dấu các biểu hiện ở phía bên tay phải của sự phân công và nhấn Ctrl + phím Shift +tôi (cho 'kiểm tra' Tôi nghĩ). Nó sẽ đánh giá biểu thức và cho bạn kết quả. Bằng cách đó bạn có thể biết giá trị của b mà không cần điểm ngắt sau khi gán.

+1

Cảm ơn, điều này không làm việc, nó chỉ cảm thấy giống như một kludge. – rtaranu

+0

@rtaranu: Tôi không nghĩ đó là một kludge, có vẻ như rất hợp lý với tôi. Vì trình gỡ rối không thể phá vỡ một '}', và bởi vì câu lệnh gán cuối cùng sẽ chưa được thực hiện khi bạn phá vỡ nó, nó rất hợp lý để chỉ phá vỡ tại điểm đó và để cho trình gỡ rối đánh giá tay phải bên của biểu thức cho bạn. – Rob

+0

@robjb: đó là một kludge, bởi vì nếu phía bên phải của bài tập có tác dụng phụ (chức năng thay đổi trạng thái của chương trình), thì nó sẽ được đánh giá một lần để tôi có thể thấy giá trị, và sau đó một lần nữa tôi để chương trình tiếp tục. Vì vậy, tôi sửa đổi hành vi của chương trình khi tôi kiểm tra nó. – rtaranu

-1

Nếu câu lệnh kết thúc được gán và nó là biến cục bộ, tại sao bạn muốn xem giá trị của nó vì nó sẽ không nằm trong phạm vi nữa và không thể có hiệu lực.

Nếu thiết lập cùng thuộc tính lớp thì bạn có thể thấy khi bạn quay lại cuộc gọi này và bạn có đối tượng mà phương thức này hoạt động.

Mặc dù điều này không trả lời được câu hỏi nhưng tôi đang cố gắng hiểu trường hợp sử dụng của sự cố của bạn.

+0

Trường hợp sử dụng là tôi đang gọi hàm kém tài liệu trong thư viện của bên thứ ba và tôi muốn xem nó trả về cái gì. Hoặc tôi đang viết một số mã và tôi muốn kiểm tra lại giá trị trước khi tôi tiếp tục viết. – rtaranu

+0

Đối với chức năng nằm trong thư viện của bên thứ ba, bạn chỉ có thể đánh giá cuộc gọi hàm bằng cách đặt đồng hồ hoặc thực hiện kiểm tra. Vì vậy, khi u r viết mã ya vấn đề này sẽ có :). – Aman

+0

Nó không liên quan đến phạm vi của các biến (tốt, một chút, vì các điểm ngắt nên được đặt ở một nơi trước khi dọn dẹp đã được thực hiện). Nếu Eclipse không thể thiết lập một điểm dừng trên một '}', đó là một vấn đề của Eclipse và không phải là một giới hạn kỹ thuật. Các trình gỡ lỗi nói chung có thể phá vỡ một '}', ví dụ: Visual Studio hiện. –

14

Để đặt điểm ngắt ở cuối khối tùy ý là không thể (không có mã băm byte).

Nếu nó là một cơ thể phương pháp, sau đó nó thể: bạn có thể đặt một Phương pháp breakpoint. Làm điều này bằng cách kích đúp vào dòng định nghĩa phương pháp:

sample code with simple method breakpoint

(thông báo vào mũi tên nhỏ?) và sau đó trong xem các breakpoint, chọn breakpoint để xem cả một Entry và một Exit tùy chọn đánh dấu vào hộp trong các thuộc tính hiển thị:

modifying the breakpoint

Các mũi tên nhỏ chỉ ra rằng, theo mặc định, chúng tôi đã thiết điểm ngắt trên mục nhập vào phương thức.

Bây giờ chọn Exit (và bỏ chọn Entry) và bạn sẽ thấy điều này trong breakpoint xem:

exit breakpoint in breakpoints view

(Có một mũi tên nhỏ khác nhau, cho thấy một breakpoint thoát.)

Bây giờ hãy chạy trình gỡ lỗi trên bộ ngắt nhỏ này ('Gỡ lỗi dưới dạng Ứng dụng Java') và nó sẽ dừng trên dấu ngoặc đơn của phương thức:

debugger stopped

và các biến cục bộ (chỉ a trong trường hợp này) hiện nay có thể nhìn thấy (với các giá trị đúng) trong Biến xem:

variables just before exit

Đó là giá trị nhận thấy rằng loại lối thoát phương pháp bẫy điểm ngắt này tuy nhiên điều này xảy ra - ngay cả, ví dụ, nếu chúng ta thoát bằng cách ném một ngoại lệ.

+0

Xem [câu trả lời này] (http://stackoverflow.com/questions/198041/eclipse-beakpoint-stop-before-leaving-a-java-method?rq=1) mà tôi không tìm ra cho đến khi tôi nhìn: - (Đó là lời khuyên cũ, và tôi hơi khác một chút, đối với Eclipse 3.7.2 –

+0

Trong IntelliJ tôi có thể đặt các điểm ngắt ở cuối các khối mã tùy ý (không nhất thiết là các phương thức). Họ phải làm việc đó " mã byte hack "dưới mui xe? –

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