Gỡ lỗi ứng dụng java mà không cần khởi động JVM với các đối số gỡ lỗi


95

Thông thường để đính kèm trình gỡ lỗi vào jvm đang chạy, bạn sẽ cần bắt đầu jvm với các đối số như sau:

> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n

Bây giờ, nếu tôi muốn gỡ lỗi một quá trình chưa được bắt đầu ở chế độ gỡ lỗi, tôi có thể làm gì?

Tình huống này xảy ra khi một hệ thống sản xuất (tức là bắt đầu mà không có các vòng gỡ lỗi) hiển thị một lỗi 'ngẫu nhiên' (tôi sử dụng thuật ngữ này một cách lỏng lẻo). Vì vậy, tôi không thể khởi động lại jvm với các đối số thích hợp, vì không ai biết cách tạo lại lỗi một lần nữa. Không thể gắn vào JVM trong tình huống này?

Chỉ cần làm rõ rằng không thể sử dụng các công cụ như jdb để đính kèm vào các JVM đã chạy trừ khi chúng được khởi động ở chế độ gỡ lỗi

từ trang người đàn ông JVM

Một cách khác để sử dụng jdb là gắn nó vào một máy ảo Java đang chạy. Một máy ảo được gỡ lỗi bằng jdb phải được khởi động với các tùy chọn sau:


Câu trả lời:


47

Bạn có thể sử dụng jsadebugd ( JDK ) để đính kèm máy chủ gỡ lỗi vào quy trình (khả dụng trên Windows với Công cụ gỡ lỗi dành cho Windows ). Nó được đánh dấu là thử nghiệm, vì vậy bạn có thể muốn dùng thử trên máy thử nghiệm trước.

Sử dụng:

jsadebugd <pid>
jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=localhost

Có thể tìm thấy tên trình kết nối với lập luận bằng cách sử dụng jdb -listconnectors.


1
Tôi đang sử dụng linux nên đây có vẻ là giải pháp hứa hẹn nhất
hhafez 17/12/08

Bất kỳ kinh nghiệm để chia sẻ với điều này?
Thorbjørn Ravn Andersen,

1
Kinh nghiệm của tôi là nó hoạt động tốt vào những thời điểm tôi cần, đồng thời, tất cả các phiên bản gốc của phần mềm đều không được định cấu hình để khởi chạy với các tùy chọn gỡ lỗi jvm theo mặc định nên chúng tôi có thể sử dụng phương pháp được hỗ trợ.
hhafez

Trên Java 11 jsadebugdđã được thay thế bằng jhsdb debugd. Vì vậy, điều đó trở thành jhsdb debugd --pid <pid>. Xem các trang trình bày của một bài nói chuyện trình bày jhsdbcác tài liệu cho jhsdb
Delthas

Có vẻ như nó SADebugServerAttachingConnectorcũng đã bị loại bỏ jdb, và tôi nghĩ rằng người thay thế được cho là jhsdb hsdb/ jhsdb clhsdb. Tôi không thể tìm thấy bất kỳ tài liệu nào về những đối số nào để cung cấp jhsdb clhsdb.
Delthas

32

Chỉ cần làm rõ rằng không thể sử dụng các công cụ như jdb để đính kèm vào các JVM đã chạy>> trừ khi chúng được khởi động ở chế độ gỡ lỗi

ở Liên Xô nguồn nga đọc bạn

jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=9426

1
cũng có nghĩa là sự "hỗ trợ" câu trả lời nhưng câu trả lời thực nghiệm là một trong tôi chấp nhận, vì vậy nó có thể được thực hiện trong một fasion không được hỗ trợ
hhafez

7

VisualVM không phải là một trình gỡ lỗi, nhưng bạn có thể nhận kết xuất luồng và kết xuất đống từ nó có thể hữu ích trong việc chẩn đoán một số vấn đề. Các tính năng hữu ích nhất yêu cầu JVM 5 hoặc 6.


liên kết không hoạt động .... có lẽ bạn Outa tháo http: // trước https: // ... Tôi sẽ đã nhưng không có danh tiếng đủ chưa
Newtopian

+1 VisualVM trông thực sự thú vị. BTW: Liên kết đã được sửa.
sleske

5

sử dụng jstack (hữu ích trong trường hợp bế tắc) hoặc plugin btrace VisualVM cũng có thể thực hiện thủ thuật


-5

Bạn luôn có thể sử dụng jdb và gỡ lỗi bằng tay: P


2
Tôi luôn nghĩ rằng bạn không thể đính kèm jvm với jdb trừ khi jvm được khởi động để cho phép kết nối gỡ lỗi Tôi có nhầm không?
hhafez 17/12/08

Theo như tôi hiểu, tùy chọn bạn đã đề cập là "bật" gỡ lỗi từ xa cho lệnh "java" của bạn (VM) Nhưng bạn cũng có thể sử dụng lệnh jdb để thay thế. Vì vậy, thay vì java MyApp, bạn sẽ sử dụng jdb MyApp (và gỡ lỗi tương tác, đặt các điểm ngắt, chạy, dừng, xem, v.v.)
OscarRyz

1
Tôi không nghĩ điều đó là chính xác theo trang người dùng jdb - bắt đầu trích dẫn Một cách khác để sử dụng jdb là gắn nó vào một máy ảo Java đang chạy. Một máy ảo sẽ được gỡ lỗi bằng jdb phải được khởi động với các tùy chọn sau: - end quote
hhafez

Với trình kết nối chính xác (hiện không được hỗ trợ) jdb có thể kết nối với một quy trình đang chạy.
Thorbjørn Ravn Andersen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.