2009-04-06 32 views
68

Tôi đã có một dự án nhỏ, khi chạy trong trình gỡ rối Eclipse, dường như luôn dừng ở dòng FileInputStream.class 106, nơi các tệp được mở. Không có điểm ngắt nào được thiết lập, nhưng Eclipse hoạt động chính xác như thể tôi có điểm ngắt ở đây. Nếu tôi xóa tất cả các điểm ngắt, nó vẫn xảy ra.Tại sao dự án Eclipse của tôi có điểm ngắt trình gỡ lỗi ảo?

Tôi có một dự án lớn hơn nhiều thứ hai trong cùng một không gian làm việc Eclipse mà không bị vấn đề này.

Tôi vừa di chuyển dự án nhỏ ra khỏi máy Linux cũ của mình, nơi tôi đã phát triển nó trong Europa Eclipse và gặp vấn đề này, trên máy Windows mới của tôi, nơi tôi tiếp tục thấy vấn đề trong Ganymede Eclipse. Vấn đề vẫn còn tồn tại trên các hệ điều hành và trên các phiên bản Eclipse, nhưng rõ ràng không nằm trong các dự án. Tôi không hiểu! Tôi grepped thông qua tất cả các tập tin trong thư mục của dự án này và không thể tìm thấy bất cứ điều gì mà có thể là một tập tin bằng cách nào đó chỉ đạo Eclipse để ngăn chặn trong FileInputStream.

Thông tin thêm: điểm ngắt rõ ràng thực sự không phải cho dòng 106 của FileInputStream; nó dường như là một điểm dừng ngoại lệ cho FileNotFoundException, được ném từ mã gốc được gọi từ dòng đó trong FileInputStream. Nhưng một lần nữa, tôi dường như không có bất kỳ điểm dừng nào cả. Các điểm ngắt ngoại lệ có được xác định ở một nơi khác không?

+0

tôi đã tự hỏi về điều đó bản thân mình, tôi thường thấy mình dừng lại ở breakpoint mà tôi có thể đã thề tôi đã loại bỏ. – Uri

+0

Chỉ cần thêm một số giải thích về tính năng "đình chỉ trên bất kỳ ngoại lệ không bị bắt buộc" này, như được yêu cầu – VonC

Trả lời

110

Bạn có cố gắng để bỏ chọn

Window > Preferences > Java > Debug : Suspend execution on uncaught exceptions 

? (Như mentioned in this thread, ví dụ)

alt text

Tại sao Eclipse làm việc theo cách đó?

goes back to 2002, khi phân cấp đối tượng điểm ngắt đã bị loại bỏ.

Để thiết lập một breakpoint, Với API cũ, một khách hàng yêu cầu Java Mẫu Đối tượng - như IType, IField vv
Với API mới, tất cả những gì theo yêu cầu của mô hình debug là loại tên, tên trường, v.v.

Điều này cho phép khách hàng đặt điểm ngắt khi không có Mô hình Java.
Bây giờ, khách hàng chỉ định tài nguyên để liên kết điểm ngắt với (trước khi chúng tôi hạn chế nó với các tài nguyên Mô hình Java được liên kết).

Các điểm ngắt hiện có thể bị "ẩn". Đó là, họ không cần phải được đăng ký với người quản lý breakpoint.
Các điểm ngắt cũng có thể được duy trì có chọn lọc (chỉ đánh dấu cho phép tất cả/không có loại điểm đánh dấu nào được duy trì).
Điều này làm cho mô hình gỡ lỗi linh hoạt hơn và cung cấp cho khách hàng nhiều khối xây dựng hơn.

này cũng đã đơn giản hóa một số phần của Java debug thực hiện của chúng tôi - ví dụ, tính năng "suspend on any uncaught exception", chỉ cần đặt một breakpoint cho các loại tên là "java.lang.Throwable", chứ không phải là cụ thể IType trong một dự án cụ thể.
Điểm ngắt không được đăng ký với trình quản lý điểm ngắt (tức làbị ẩn) - chỉ được một khách hàng biết và sử dụng.
Ví dụ khác là "run to line breakpoint". IJavaRunToLineBreakpoint đã bị xóa vì chức năng đặc biệt của nó không còn cần thiết nữa. Bây giờ, trình gỡ lỗi Java ui chỉ đơn giản tạo ra một "điểm ngắt dòng" được ẩn, không tồn tại và có số lần truy cập là 1. Ví dụ về việc cung cấp các khối xây dựng cho các máy khách.

+0

Điều đó đã làm được! Cảm ơn bạn! Bây giờ tại sao Eclipse thậm chí làm việc theo cách này? – skiphoppy

+0

Nó giúp phát hiện những ngoại lệ thời gian chạy không được kiểm soát mà không được mã của bạn vô hiệu. – VonC

+0

Tôi đang gặp phải hành vi tương tự và tôi không bỏ chọn "tạm ngưng thực thi trên các ngoại lệ uhncaught". Tôi thích để lại tùy chọn kiểm tra nhưng tôi sẽ quan tâm đến việc biết ngoại lệ xảy ra, làm thế nào tôi có thể biết điều này? – HAL9000

34

Tôi gặp sự cố tương tự nhưng giải pháp được chấp nhận không hoạt động đối với tôi. Tôi đang phát triển Eclipse Android và đã thiết lập một số điểm ngắt và sau đó không đặt chúng. Mặc dù tôi đã vô hiệu hóa chúng, Eclipse vẫn tiếp tục dừng thực hiện tại các điểm ngắt ảo này. Các giải pháp đối với tôi là để mở cửa sổ Breakpoints:

Window> Show View> Khác ...

Debug> Breakpoints

Sau đó click chuột phải bất kỳ breakpoint và chọn "Remove All"

Thật không may, bạn phải thiết lập lại tất cả các điểm ngắt hợp lệ của bạn, nhưng điều này làm việc cho tôi và đã ngăn chặn nhiều angst và thất vọng về phía trước.

Một số hình ảnh để hướng dẫn những người khác:

Add Breakpoints window to Eclipse

Remove All (Breakpoints, right click)

+0

Cảm ơn, Mark. Điều này đã giúp. Nhưng tôi đã không loại bỏ tất cả, chỉ tìm thấy một trong đó gây ra một rắc rối. – morphium

+0

Cảm ơn Mark! Làm việc cho tôi, nhưng giống như anh chàng ở trên, tôi chỉ cần loại bỏ cái tôi cần. Bực bội rằng một điểm dừng đã đăng ký thậm chí không hiển thị trong khung nhìn trình soạn thảo trên thanh bên. Quả thực chúng là điểm "ma" trong trường hợp đó. – The111

+0

Tôi có thể tìm thấy giải pháp cho vấn đề liên quan đến cách giải quyết của bạn. Lần sau nó xảy ra thử giải pháp của tôi dưới đây. – HAL9000

4

Đối với những người không tìm ra giải pháp hữu ích khác, tôi thấy giải pháp cá nhân của tôi cho vấn đề của tôi. Tôi làm việc với một thư viện .jar được tạo ra bằng cách xây dựng một dự án khác vào không gian làm việc. Nếu tôi đặt một điểm ngắt trong một .java vào dự án thư viện, thì điểm ngắt sẽ được kích hoạt khi gỡ lỗi dự án cuối cùng. Tuy nhiên khi trình gỡ lỗi tạm dừng việc thực hiện tệp .class được hiển thị có điểm ngắt riêng của nó và do đó điểm ngắt được đặt thành tệp .java không được hiển thị ở đây!

Giải pháp: Để xóa điểm ngắt bạn phải xóa điểm ngắt vào tệp .java, trong dự án thư viện.

0

Đối với những người không tìm thấy giải pháp từ các câu trả lời trước, họ có thể thử những gì đã giải quyết được vấn đề của tôi. Tôi nghĩ tương tự như vấn đề/giải pháp HAL9000

Nếu bạn có hai lớp có cùng tên (trong hai dự án khác nhau) thì các điểm ngắt trên một, cũng áp dụng cho điểm khác. Cả hai đều hiển thị trong cửa sổ "Breakpoints".

Giải pháp: Nếu bạn loại bỏ điểm ngắt khỏi lớp - với cùng tên - mà bạn không sử dụng nó sẽ xóa điểm ngắt khỏi lớp bạn đang gỡ lỗi.

1

Tôi đã gặp sự cố trong đó tệp nguồn có các điểm đánh dấu liên tục cho các điểm ngắt không tồn tại. Tôi đã thử làm sạch dự án, làm một bản dựng đầy đủ, khởi động lại Eclipse - không có gì làm việc.

Tôi đã tìm hiểu thông qua siêu dữ liệu Eclipse và tìm thấy các tệp .markers của dự án. Xóa tệp đó cuối cùng đã khắc phục sự cố.

Đối với bất kỳ ai có vấn đề này, hãy mở thư mục không gian làm việc của bạn, sau đó điều hướng đến .metadata/.plugins/org.eclipse.core.resources/.projects/dự án của bạn, sau đó đổi tên/xóa tệp .markers.

Ví dụ, nếu thư mục workspace của bạn là ~/không gian làm việc, và dự án của bạn được đặt tên Foo, bạn có thể làm:

$ mv ~/workspace/.metadata/.plugins/org.eclipse.core.resources/.projects/Foo/.markers ~/safe.Foo.markers 
Các vấn đề liên quan