Các tùy chọn dòng lệnh Java được đặt để cho phép JVM được gỡ lỗi từ xa là gì?


321

Tôi biết có một số JAVA_OPTSđể thiết lập để gỡ lỗi từ xa một chương trình Java.

Chúng là gì và chúng có ý nghĩa gì?

Câu trả lời:


303

Tôi có bài viết này được đánh dấu khi thiết lập điều này cho Java 5 trở xuống.

Về cơ bản chạy nó với :

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

Đối với Java 5 trở lên , hãy chạy nó với:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044

19
Đáng nói là bạn có thể muốn định cấu hình địa chỉ của mình *:1044để bật gỡ lỗi từ bất kỳ máy tính nào
Herr Derb

6
HerrDerb đã đúng .. Vì Java 9 "address = 1044" không phải lúc nào cũng lắng nghe trên tất cả các giao diện. "address = *: 1044" làm cho Java 9+ hoạt động giống như Java 8 ...
alfonx

459

Trước Java 5.0, sử dụng -Xdebug-Xrunjdwpđối số. Các tùy chọn này sẽ vẫn hoạt động trong các phiên bản sau, nhưng nó sẽ chạy ở chế độ diễn giải thay vì JIT, sẽ chậm hơn.

Từ Java 5.0, tốt hơn là sử dụng -agentlib:jdwptùy chọn duy nhất:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

Các tùy chọn trên -Xrunjdwphoặc agentlib:jdwpđối số là:

  • transport=dt_socket : có nghĩa là cách được sử dụng để kết nối với JVM (socket là một lựa chọn tốt, nó có thể được sử dụng để gỡ lỗi một máy tính ở xa)
  • address=8000 : Cổng TCP / IP được hiển thị, để kết nối từ trình gỡ lỗi,
  • suspend=y : nếu 'y', hãy báo cho JVM đợi cho đến khi trình gỡ lỗi được đính kèm để bắt đầu thực thi, nếu không (nếu 'n'), bắt đầu thực thi ngay.

7
Bạn hoàn toàn chính xác .. Tôi đã thử với -Xdebug-Xrunjdwp nhưng nó không hoạt động. khi tôi đã thử với -Xrunjdwp hoặc agentlib: jdwp Nó đang hoạt động. (trên Java 7)
RoboAlex

Điều này chỉ hoạt động với tôi khi tôi đặt dấu ngoặc kép xung quanh nó, nếu không tôi đã gặp lỗi này: LRI: JDWP Vận chuyển không phải máy chủ dt_socket server = y Suspend = y address = 8000 phải có địa chỉ kết nối được chỉ định thông qua tùy chọn 'address ='
Ring

1
Được Xrunjdwpphản đối (hoặc loại bỏ?) Tại sao chúng ta sẽ chọn agentlib:jdwpnó?
ArtOfWarfare

2
Tôi nghĩ bạn đã sai. Netbeans sử dụng -Xdebug -Xrunjdwpkhi gỡ lỗi các dự án Maven và chúng chạy giống như chúng bị JITed.
Alexanderr Dubinsky

78

Do Java 9.0 JDWP chỉ hỗ trợ các kết nối cục bộ. http://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435

Để gỡ lỗi từ xa, một chương trình nên chạy với *:địa chỉ:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000

1
Điều này sẽ nhận được nhiều upvote hơn, vì đó là một gợi ý quan trọng áp dụng cho tất cả các phiên bản Java mới.
Sebastian S

1
Chỉ cần ghi chú: liên kết Oracle cho biết điều này sẽ đạt được hành vi cũ tương tự, nhưng nó không an toàn và không được khuyến nghị.
Chanseok Oh

9

Đối với java 1.5 trở lên:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Đối với java 1.4:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Đối với java 1.3:

java -Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 <YourAppName>

Đây là đầu ra từ một chương trình đơn giản:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044 HelloWhirled
Listening for transport dt_socket at address: 1044
Hello whirled

5

java

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8001,suspend=y -jar target/cxf-boot-simple-0.0.1-SNAPSHOT.jar

address chỉ định cổng mà tại đó nó sẽ cho phép gỡ lỗi

Maven

** Ứng dụng gỡ lỗi Spring Boot với Maven:

mvn spring-boot:run -Drun.jvmArguments=**"-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8001"

2

Đây là giải pháp dễ nhất.

Có rất nhiều cấu hình môi trường đặc biệt cần thiết nếu bạn đang sử dụng Maven. Vì vậy, nếu bạn khởi động chương trình của mình từ maven, chỉ cần chạy mvnDebuglệnh thay vì mvn, nó sẽ đảm nhiệm việc khởi động ứng dụng của bạn với cấu hình gỡ lỗi từ xa được cấu hình. Bây giờ bạn chỉ có thể đính kèm một trình gỡ lỗi trên cổng 8000.

Nó sẽ giải quyết tất cả các vấn đề môi trường cho bạn.


1

Dòng lệnh

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=PORT_NUMBER

Học sinh lớp

gradle bootrun --debug-jvm

Maven

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=PORT_NUMBER

Ở đây chúng tôi chỉ sử dụng Trình kết nối ổ cắm, được bật theo mặc định khi vận chuyển dt_socket được định cấu hình và VM đang chạy trong chế độ gỡ lỗi máy chủ.

Để biết thêm chi tiết, bạn có thể tham khảo: https://stackify.com/java-remote-debugging/

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.