Gỡ lỗi từ xa một ứng dụng Java


254

Tôi có một ứng dụng java chạy trên máy linux. Tôi chạy ứng dụng java bằng cách sử dụng như sau:

java myapp -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000, suspend=n

Tôi đã mở cổng 4000 cho TCP trên máy Linux này. Tôi sử dụng nhật thực từ máy Windows XP và thử kết nối với ứng dụng này. Tôi cũng đã mở cổng trong windows.

Cả hai máy đều nằm trong mạng LAN nhưng dường như tôi không thể kết nối trình gỡ lỗi với ứng dụng Java. Tôi đang làm gì sai?




Không phải là một bản sao cả. Đầu tiên, đây là một câu hỏi cũ hơn. Thứ hai, câu trả lời cho câu hỏi này nên không rõ ràng về môi trường gỡ lỗi.
Addison

Câu trả lời:


476

Chỉnh sửa: Tôi nhận thấy rằng một số người đang cắt và dán lời mời ở đây. Câu trả lời ban đầu tôi đưa ra chỉ liên quan đến OP. Đây là một kiểu gọi hiện đại hơn (bao gồm sử dụng cổng 8000 thông thường hơn):

java -agentlib:jdwp=transport=dt_socket,server=y,address=8000,suspend=n <other arguments>

Câu trả lời gốc sau.


Thử cái này:

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n myapp

Hai điểm ở đây:

  1. Không có khoảng trắng trong runjdwptùy chọn.
  2. Tùy chọn đến trước tên lớp. Bất kỳ đối số nào bạn có sau tên lớp là đối số cho chương trình của bạn!


2
@DJGummikuh Đẹp quá! Tôi đã cập nhật bài đăng để sử dụng -agentlibtùy chọn kiểu mới hơn cho niềm vui cắt và dán của bạn. :-)
Chris Jester-Young

Chúng ta có luôn cần phải có mã nguồn cho ứng dụng từ xa có mặt trong máy mà chúng ta thực hiện gỡ lỗi từ xa không?
MasterJoe2

Bạn cần biết mã nguồn. Hoặc bạn có các tệp .java hoặc bạn có các tệp .jar /. Class kết hợp với trình dịch ngược. IDE như Eclipse có thể có một trình dịch ngược như JDecompiler được cài đặt để bạn có thể gỡ lỗi tệp. Class như thể đó là tệp .java (không bao gồm các chú thích).
Iwan Satria

1
Đáng để nhắc lại một nhận xét từ stackoverflow.com/a/138518/500902 , "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." Địa chỉ = *: 1044 "làm cho Java 9+ hoạt động giống như Java 8" cho phép gỡ lỗi từ các máy chủ khác nhau
Marvin

84

Đối với JDK 1.3 trở về trước:

-Xnoagent -Djava.compiler=NONE -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6006

Đối với JDK 1.4

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

Đối với JDK mới hơn:

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

Vui lòng thay đổi số cổng dựa trên nhu cầu của bạn.

Từ kỹ thuật java

Từ 5.0 trở đi, tùy chọn -agentlib: jdwp được sử dụng để tải và chỉ định các tùy chọn cho tác nhân JDWP. Đối với các bản phát hành trước 5.0, các tùy chọn -Xdebug và -Xrunjdwp được sử dụng (việc triển khai 5.0 cũng hỗ trợ các tùy chọn -Xdebug và -Xrunjdwp nhưng tùy chọn -agentlib: jdwp mới hơn thích hợp hơn vì tác nhân JDWP trong 5.0 VM thay vì giao diện JVMDI cũ hơn)

Một điều nữa cần lưu ý, từ tài liệu giao diện JVM Tool :

JVM TI được giới thiệu tại JDK 5.0. JVM TI thay thế Giao diện trình biên dịch máy ảo Java (JVMPI) và Giao diện gỡ lỗi máy ảo Java (JVMDI), kể từ JDK 6, không còn được cung cấp.


Các công việc sau đây với các cài đặt mặc định của Eclipse: -agentlib: jdwp = Transport = dt_socket, server = y, address = 8000
Sundae

29

Các bước:

  1. Bắt đầu ứng dụng java từ xa của bạn với các tùy chọn gỡ lỗi như đã nói ở bài trên.
  2. Định cấu hình Eclipse để gỡ lỗi từ xa bằng cách chỉ định máy chủ và cổng.
  3. Bắt đầu gỡ lỗi từ xa trong Eclipse và chờ kết nối thành công.
  4. Thiết lập điểm dừng và gỡ lỗi.
  5. Nếu bạn muốn gỡ lỗi từ khi bắt đầu ứng dụng, hãy sử dụng Suspend = y, điều này sẽ khiến ứng dụng từ xa bị treo cho đến khi bạn kết nối từ nhật thực.

Xem hướng dẫn từng bước về gỡ lỗi từ xa Java để biết chi tiết đầy đủ.


16

Trả lời bao gồm Java> = 9:

Đối với Java 9+, tùy chọn JVM cần một thay đổi nhỏ bằng cách thêm tiền tố vào địa chỉ IP của máy lưu trữ JVM hoặc chỉ *:

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

Điều này là do một thay đổi được ghi nhận trong https://www.oracle.com/technetwork/java/javase/9-notes-3745703.html#JDK-8041435 .

Đối với Java <9, số cổng là đủ để kết nối.


8

Tôi muốn nhấn mạnh rằng thứ tự lập luận là quan trọng .

Đối với tôi java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000 -jar app.jarlệnh mở cổng gỡ lỗi ,

nhưng java -jar app.jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000lệnh thì không .


3
Tôi đoán đó là bởi vì trong ví dụ thứ hai của bạn, mọi thứ sau "app.jar" được truyền dưới dạng đối số vào phương thức chính của bạn
xoX Zeus Xox

@xoXZeusXox ha ha. Vâng, nó đã thông qua như là đối số. Cảm ơn đã đề cập.
MrBlack

1

Đây là cách bạn nên thiết lập Trình gỡ lỗi Eclipse để gỡ lỗi từ xa:

Cài đặt Eclipse:

1.Click Run Nút
2.Select Debug Configurations
3.Select các “Remote Java Application”
4.New Cấu hình

  • Tên: Dự án GatewayPortal
  • Dự án: GatewayPortal-portlet
  • Kiểu kết nối: Ổ cắm đính kèm
  • Thuộc tính kết nối: i) localhost ii) 8787

Đối với JBoss:

1.Thay đổi /path/toJboss/jboss-eap-6.1/bin/standalone.conftrong vm của bạn như sau: Bỏ dòng sau bằng cách xóa #:

JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,address=8787,server=y,suspend=n"

Đối với Tomcat:

Trong tệp catalina.bat :

Bước 1:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n"

Bước 2:

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

Bước 3: Chạy Tomcat từ dấu nhắc lệnh như bên dưới:

catalina.sh jpda start

Sau đó, bạn cần đặt các điểm dừng trong các lớp Java mà bạn muốn gỡ lỗi.


Trong Java 8, JDK hỗ trợ biến môi trường JAVA_TOOL_OPTIONS để kích hoạt trình gỡ lỗi cho bất kỳ ứng dụng Java nào bạn cần sử dụng: JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n ps xin lỗi vì đã chỉnh sửa, chiến đấu với trình định dạng.
Nathan Niesen
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.