2010-10-19 41 views
5

Tôi đã cố gắng kết nối hai trình gỡ rối khách hàng thành một chương trình Debuggee trong ngữ cảnh của JPDA. Điều này có thể hoặc có cách giải quyết nào để làm cho điều đó xảy ra không?Kết nối nhiều trình gỡ lỗi với một trình gỡ lỗi (Java, JPDA)

Tôi đang sử dụng nhật thực làm IDE (chỉnh sửa cho lỗi đánh máy). Hãy suy nghĩ của một chương trình máy chủ như một Hello World mà In ra:

System.out.println("I have the String"); //1 
System.out.println("You will have to pass through the breakpoints before you shall see"); 
System.out.println("breakpoints"); 
System.out.println("before you shall see"); //4 

Chúng ta có thể đặt breakpoint tại dòng 1 và 4.

Bước 1: Các params truyền cho chương trình trong Run Cấu hình:

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

(server=y nói vm cư xử giống như một máy chủ, suspend=y ngụ ý rằng thực hiện prog sẽ bị đình chỉ cho đến khi debugger chốt vào nó) 0.123.và Chạy chương trình.

Bước 2: Tới Debug as , Debug config ,Remote Java application và tạo một đối tượng mới:

Project: Same as before 
Connection type: Socket Attach(Socket Attach) 
Host:LocalHost 
Port:8000 

Bây giờ khi tôi gỡ lỗi Prog thực hiện dừng lại ở breakpoint quy định. Những gì tôi không thể làm là tạo ra một thể hiện của trình gỡ lỗi từ xa này có thể chốt vào máy chủ (prog 1), tôi nhận được một kết nối từ chối khi tôi làm điều đó. Hãy cho tôi biết nếu có ai khác phải đối mặt với vấn đề này và nếu có một giải pháp thay thế. Cảm ơn!

Cảm ơn

+0

Nếu nó có thể thực hiện được (điều tôi thực sự nghĩ là không), nó sẽ không có ý nghĩa gì ngoại trừ các tình huống mà một trình gỡ lỗi hành động như một bậc thầy và những người khác chỉ cần theo dõi nó để xem làm thế nào quá trình dừng lại ở breakpoint, bắt ngoại lệ et c. (Ít nhất tôi không thể nghĩ ra cách sử dụng tốt nhưng tôi muốn tìm hiểu thêm) – Fredrik

+0

fwiw, có quan điểm riêng, như bạn mô tả, có vẻ hữu ích đối với tôi. Sẽ thật tuyệt khi mở một vài cửa sổ jdb riêng biệt khi gỡ lỗi với jdb, một để kiểm soát, một để xem một số biến, một để xem theo dõi ngăn xếp, v.v. Điều này sẽ cho phép gỡ lỗi dòng lệnh giống với Eclipse có nhiều cửa sổ. – NHDaly

Trả lời

1

AFAIK có thể chỉ có một thể hiện của debugger kết nối với một chương trình java bất kỳ thời điểm nào. Khi bạn bắt đầu chương trình gỡ lỗi, Eclipse sẽ kết nối với chương trình gỡ rối chặn tất cả các kết nối khác. Nếu bạn muốn kết nối từ xa, bạn có thể chạy chương trình không ở chế độ gỡ lỗi và thêm các tham số: -Xdebug -Xrunjdwp: transport = dt_socket, address = 8000, server = y, suspend = y vào tham số java theo cách thủ công, sau đó bạn nên có thể kết nối với trình gỡ lỗi khác.

+0

well Ý tưởng cốt lõi là cho phép gỡ lỗi các chủ đề loại trừ lẫn nhau trong cùng một quy trình Máy chủ, Đã thử nó theo cách thủ công để có được một kết nối bị từ chối. Có một giao thức hiện có cho phép nghe trên một cổng mới nếu một yêu cầu đến tại một cổng hiện có đang phục vụ một yêu cầu khác không? (Chỉnh sửa dấu chấm câu) Cảm ơn bạn đã bình luận của bạn Yuval và Fredrick. – javaresearcher

+0

Hơn nữa, tôi đã xem: http://download.oracle.com/javase/6/docs/technotes/guides/jpda/jpda_spis.html#TransportDev nói về Phát triển TransportService để hỗ trợ nhiều kết nối đồng thời tới một địa chỉ người nghe duy nhất. Bây giờ một câu hỏi khác là có ai đã làm điều này hoặc cố gắng? – javaresearcher

+0

@javaresearcher tiếp tục nghe trên cổng sau khi chấp nhận kết nối không phải là vấn đề. Vấn đề ở đây là nó sẽ làm cho toàn bộ quá trình gỡ lỗi cực kỳ không trực quan. Một chút giống như lái xe với ba hành khách và một bộ tay lái và bàn đạp ở trước mỗi chỗ ngồi. Chỉ có một người có thể kiểm soát được vào bất kỳ thời điểm nào hoặc mọi thứ sẽ trở nên khủng khiếp sai. Tôi nghĩ nó sẽ có ý nghĩa hơn nếu bạn cố gắng giải thích lý do tại sao bạn đang cố gắng làm điều đó. Có thể có một cách tốt hơn để làm những gì bạn muốn. (chỉnh sửa: xem "ý tưởng cốt lõi" trong nhận xét hàng đầu của bạn ngay bây giờ nhưng tại sao hai trình gỡ rối?) – Fredrik

0

Nó sẽ hữu ích trong môi trường được chia sẻ trên máy chủ. Giả sử bạn đang phát triển một ứng dụng máy chủ lớn và chỉ có một máy chủ thử nghiệm. Tất cả các nhà phát triển đều triển khai cùng một máy chủ được chia sẻ. Trong bối cảnh này nó sẽ là âm thanh để có nhiều kết nối gỡ lỗi.

Điều này đặc biệt có ý nghĩa trong ứng dụng máy chủ tận dụng OSGI. Mỗi nhà phát triển sẽ viết mã, triển khai, dừng, bắt đầu và gỡ lỗi một mô-đun khác.

+0

Điều gì sẽ xảy ra nếu hai nhà phát triển gỡ lỗi cùng một mô-đun? –

0

Tôi không biết mọi thứ diễn ra như thế nào trong năm 2010, nhưng trong năm 2014, điều này có thể thực hiện được. Tôi đang gỡ lỗi một applet và một servlet tại cùng một thời điểm mà họ sử dụng JVM khác nhau, để làm như vậy chỉ cần bắt đầu quá trình gỡ lỗi từ xa của bạn trong eclipse như socket Nghe, bắt đầu ứng dụng java đầu tiên với:

-Xdebug -Xrunjdwp : transport = dt_socket, address = 127.0.0.1: 8787, suspend = y

Sau đó bắt đầu cùng che khuất quá trình gỡ lỗi từ xa và bắt đầu một quá trình java với các tùy chọn tương tự, bạn sẽ thấy các quá trình đẻ trứng như thế này:

debug in eclipse

Bạn có thể thấy hai JVM khác nhau lắng nghe trong cùng một cổng (không bao giờ là tên của quy trình 'applet')

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