2008-12-16 33 views
51

Tôi nhận được NullPointerException trong một Lớp học từ thư viện của bên thứ ba. Bây giờ tôi muốn gỡ lỗi toàn bộ điều và tôi sẽ cần phải biết từ đối tượng mà lớp được tổ chức. Nhưng có vẻ như với tôi rằng tôi không thể đặt điểm dừng trong lớp học từ một bên thứ ba.Làm thế nào để thiết lập một điểm ngắt trong Eclipse trong thư viện của bên thứ ba?

Có ai biết cách thoát khỏi rắc rối của tôi không? Tất nhiên tôi đang sử dụng Eclipse làm IDE của tôi.

Cập nhật: thư viện là nguồn mở.

Trả lời

31

Cách chắc chắn nhất để thực hiện việc này (và kết thúc với một cái gì đó thực sự hữu ích) là tải xuống nguồn (bạn nói rằng đó là mã nguồn mở) và thiết lập "Dự án Java" khác nguồn.

Để làm điều đó, hãy tải xuống và giải nén nguồn ở đâu đó trên hệ thống của bạn. Nhấp vào "Tệp" -> "Mới" -> "Dự án Java". Trong hộp thoại tiếp theo, đặt tên dự án và chọn "Tạo dự án từ nguồn hiện tại". Duyệt đến vị trí gốc của thư viện nguồn mở.

Giả sử rằng tất cả các thư viện bổ sung được dự án yêu cầu và được bao gồm trong dự án bạn đã tải xuống, Eclipse sẽ tìm mọi thứ và thiết lập đường dẫn xây dựng cho bạn.

Bạn sẽ cần phải xóa bình nguồn mở khỏi đường dẫn xây dựng của dự án và thêm dự án mới này vào đường dẫn xây dựng của dự án của bạn.

Bây giờ, bạn chỉ có thể coi đây là mã của bạn và gỡ lỗi theo ý muốn.

này được xung quanh ít nhất một vài vấn đề với cách tiếp cận khác:

  1. Bạn có thể "đính kèm nguồn" đối với file jar, nhưng nếu file jar được biên soạn không có thông tin gỡ lỗi, đây vẫn thắng' t làm việc. Nếu tệp jar được biên dịch với thông tin gỡ lỗi (lines,source,vars ... xem http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html và tùy chọn -g).

  2. Bạn có thể thêm "điểm ngắt ngoại lệ" để xem khi nào NullPointerException được nâng lên, nhưng đó là một ngoại lệ phổ biến và có thể được nâng lên và xử lý nhiều (hàng trăm lần) trước khi bạn đang tìm kiếm cho. Thêm vào đó, không có nguồn gốc, bạn sẽ không thể thực sự thấy nhiều thứ về mã đang ném NullPointerException - khả năng bạn sẽ có thể tìm ra cái gì sai là khá thấp.

+0

khi gỡ lỗi một thư viện bên ngoài, nếu chúng ta thấy các chú thích trong các lớp của thư viện này, nó có nghĩa là nó đã được biên dịch bằng cách sử dụng '-g'option? Tài liệu nói rằng '-g: Tạo tất cả thông tin gỡ lỗi, bao gồm các biến cục bộ.', thì chỉ có' ​​nguồn', 'dòng' và' biến' được đề cập. Tôi đọc trên coderanch rằng 'tên thật của các trường' cũng được sử dụng http://www.coderanch.com/t/262054/java-programmer-SCJP/certification/javac-option. Nhưng không có gì được đề cập về ý kiến. –

+0

Tôi mong đợi tùy chọn '-g' cho phép chúng tôi gỡ lỗi mà không gặp bất kỳ sự cố nào, nghĩa là, có thể giữ cho trình gỡ rối được đồng bộ hóa với mã. Tôi đoán cách duy nhất để làm điều này là để các tập tin lớp "bị ảnh hưởng". Đây có phải là điều này không?Lưu ý: Tôi đã tìm kiếm thông tin rõ ràng về điều này nhưng có vẻ như tạo ra một cái bình với & sau đó mà không có '-g' là cách duy nhất để tìm hiểu những gì thực sự thay đổi khi sử dụng tùy chọn' -g' đó. –

58

Bạn có thể dễ dàng đặt các điểm ngắt phương thức trong thư viện của bên thứ ba mà không cần nguồn. Chỉ cần mở lớp (bạn sẽ nhận được chế độ xem "i-have-no-source"). Mở đường viền, nhấp chuột phải vào phương thức bạn muốn và nhấp vào Toggle Method Breakpoint để tạo điểm ngắt phương thức.

+2

Điều này yêu cầu thư viện của bên thứ ba được biên dịch bằng các biểu tượng gỡ lỗi. –

+0

Ah, có thể không ... nhưng tôi thấy tôi không thể đặt điểm ngắt phương thức trong giao diện ServletResponse, trong khi tôi có thể đặt một điểm trong lớp triển khai (ServletResponseWrapper). –

+1

Không còn nữa ... – kolobok

1

Thông thường, bạn có thể đặt điểm ngắt. Đặc biệt nếu thư viện của bên thứ ba là nguồn mở. Nhưng nếu lib bên thứ 3 của bạn đến từ một nhà cung cấp thương mại, họ có thể đã biên dịch nguồn với cờ gỡ lỗi được tắt. Điều này sẽ làm cho nó không thể cho bạn để gỡ lỗi vào nó. Nhà cung cấp của bạn có thể đã thực hiện điều này như là một phần của quá trình obfuscation để làm cho nó không thể đảo ngược thiết kế thư viện, hoặc đơn giản chỉ vì các lớp được biên dịch cuối cùng sẽ nhỏ hơn.

+0

Tôi sẽ hỏi một đồng nghiệp nếu cờ gỡ lỗi đã bị tắt. – boutta

6

Bạn cũng có thể đặt điểm ngắt trên các ngoại lệ cụ thể. Từ phối cảnh Debug, có một nút "Add Java Exception Breakpoint", và ở đó bạn có thể thêm "NullPointerException". Trình gỡ lỗi của bạn sau đó sẽ tạm ngừng thực thi ngay sau khi ngoại lệ được nêu ra.

+0

Điều này không bắt được các ngoại lệ trong thư viện. Có lẽ có cái gì đó về những gì Bent nói với cờ gỡ lỗi không được thiết lập. – boutta

+0

Tôi chưa bao giờ thấy điều đó xảy ra. JVM vẫn có dấu vết ngăn xếp, chỉ không có nguồn hoặc số dòng, do đó, nó vẫn nên phá vỡ ngoại lệ. – Robin

+0

Tôi đã sử dụng điều này để bắt một ngoại lệ servlet trong Eclipse gỡ lỗi một vấn đề mà tôi dường như không thể bắt được trong mã ứng dụng. Rất cám ơn về mẹo này! –

1

Chỉ cần đính kèm nguồn (hoặc sử dụng thứ gì đó tự động gắn bình nguồn) và sau đó đặt điểm ngắt theo cách thông thường, bằng cách nhấp đúp vào bên trái của dòng yêu thích.

+0

Phương pháp này đã giúp tôi rất nhiều khi gỡ lỗi ứng dụng của tôi được liên kết với một dự án Nguồn mở. Trong trường hợp của tôi, tôi có (a) một cái lọ với các lớp, (b) một cái lọ với các nguồn tương ứng, và (c) tôi giải nén các nguồn vào ổ đĩa cục bộ của mình. Để đặt một điểm dừng trên một hàm trong dự án nguồn mở, tôi (1) đã mở tệp nguồn ổ đĩa cục bộ cụ thể trong Eclipse và (2) đặt một điểm ngắt trên dòng hàm mong muốn. Khi tôi chạy ứng dụng của mình, Eclipse đã đủ thông minh để phá vỡ điểm mong muốn. –

1

Để thực hiện công việc này với ứng dụng web được mô tả bằng maven, tôi phải làm ba việc.

1) Tạo dự án nhật thực mới với mã nguồn của bình bên thứ 3.

2) Xóa tham chiếu đến bình từ phụ thuộc pom.xml.

3) Thêm dự án nhật thực mới vào Hội triển khai trong thuộc tính dự án.

4) Thêm dự án nhật thực mới vào dự án Thuộc tính -> Đường dẫn xây dựng Java -> Dự án của dự án hiện có tham chiếu đến dự án của bên thứ ba.

Nếu dự án thứ 3 đã được thêm vào kho lưu trữ của bạn một cách chính xác, với nguồn, maven sẽ tự động tải xuống mã nguồn thích hợp và cho phép bạn thêm điểm ngắt mà không cần phải thực hiện bất kỳ bước nào ở trên; tuy nhiên, tôi đã học được rằng bạn không thể luôn luôn dựa vào điều này.

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