2009-05-13 48 views
15

Làm thế nào để thiết lập các điểm ngắt trong Java hoạt động? Chỉ dựa trên tên tệp và số dòng? Liệu tên lớp hoặc tên phương thức cũng có phải là?Thiết lập các điểm ngắt trong Java

Nếu tôi có một phiên bản cũ của nguồn trong trình gỡ lỗi và đặt điểm ngắt, con trỏ tắt khi tôi duyệt qua. Làm thế nào xa nó có thể được? Nó có thể đi vào sai phương pháp (hoặc thậm chí là lớp sai nếu có nhiều hơn một lớp trong tập tin đó)?

Điều gì sẽ xảy ra khi có nhiều lớp cùng tên trong JVM (có thể xảy ra nếu bạn có nhiều hơn một trình nạp lớp)? Tất cả họ đều có điểm dừng?

Trong vùng chứa ứng dụng web, tôi có thể đặt điểm ngắt cho chỉ một ứng dụng web (chứ không phải các ứng dụng khác) không?

Bao nhiêu điều này là IDE cụ thể và bao nhiêu được xác định bởi giao diện gỡ lỗi mà JVM cung cấp? Ví dụ: Trong Eclipse tôi có thể thiết lập các điểm ngắt có điều kiện dựa trên các giá trị của các biến. Đó có phải là chỉ lọc Eclipse thực hiện trên một điểm ngắt vô điều kiện trong JVM không?

+0

Tôi thực sự nghĩ rằng bạn cần phải có nhiều IDE cụ thể hơn ở đây. –

+0

Không phải tất cả IDE đều sử dụng cùng một giao diện trình gỡ lỗi mà JVM cung cấp không? – Thilo

Trả lời

13

Có nhiều loại điểm ngắt khác nhau. Một số điểm ngắt là dựa trên dòng, một số thì không. Làm thế nào điều này ảnh hưởng đến gỡ lỗi thực tế của bạn phụ thuộc vào những gì IDE của bạn thực sự làm. Ví dụ, trong Eclipse, nếu bạn thêm một điểm ngắt ở giữa một phương thức, đó sẽ là một điểm ngắt dựa trên dòng. Nếu bạn thêm một điểm ngắt trên một dòng có chứa chữ ký của một phương thức, đó sẽ là một điểm ngắt của phương thức.

Nếu mã nguồn bạn đang xem không phải là nguồn chính xác của lớp đang chạy, điểm ngắt dòng sẽ không được ánh xạ lên dòng bên phải của khóa học. Vì vậy, java có thể không dừng lại ở dòng bạn dự định, và IDE của bạn thực sự có thể được hiển thị cho bạn phương pháp sai hoặc thậm chí lớp sai. Nhưng một điểm ngắt phương thức nhập vẫn sẽ hoạt động (dừng tại thời điểm thích hợp), ngay cả khi dòng mà phương thức đã được xác định đã thay đổi; nhưng một lần nữa một IDE có thể hiển thị sai dòng trong trình gỡ lỗi. (Và cũng có các loại sự kiện/điểm ngắt khác, như tải lớp, ... Bạn có thể xem qua các giao diện con của EventRequest nếu bạn muốn biết thêm về nội bộ).

Để trả lời câu hỏi khác của bạn: các điểm ngắt áp dụng cho tất cả các trình nạp lớp trong JVM.

6

JVM hỗ trợ API chuẩn để gỡ lỗi (xem Java Platform Debugger Architecture) và tất cả IDE sử dụng JPDA để thực hiện tất cả các điểm ngắt thiết lập nặng, biểu thức tính toán, v.v. Các IDE "chỉ" quấn nó lên trong giao diện người dùng tốt đẹp.

Khi bạn đặt điểm ngắt, IDE nói chuyện với giao diện công cụ của JVM (một phần của JDPA) và cung cấp cho nó tệp nguồn và số dòng của điểm ngắt. JVM có thông tin cần thiết để ánh xạ vị trí vật lý của điểm ngắt vào vị trí thực tế của câu lệnh Java trong mã được biên dịch của lớp. Khi JVM đạt đến điểm ngắt, nó dừng thực thi luồng đó và cho IDE biết tệp nguồn và số dòng của IDE. IDE sau đó hiển thị vị trí cho bạn.

Khi tôi gỡ lỗi, đôi khi tôi thêm hoặc xóa các dòng để khắc phục sự cố và sau đó tiếp tục đến vấn đề tiếp theo. Nhưng mọi thứ trở nên kinh khủng bởi vì các điểm ngắt xuất hiện sớm hoặc muộn hơn tôi mong đợi, và nếu tôi đặt các điểm ngắt mới, chúng không thực sự ở dòng nguồn tôi đặt chúng ở đó. Khi điều này xảy ra, tôi khởi động lại chương trình và sau đó cả IDE và JVM đều nhất quán một lần nữa.

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