2010-08-28 33 views
47

Tôi thực sự thích các cơ sở gỡ lỗi từ xa của JVM. Nhưng tôi tự hỏi nó hoạt động như thế nào trong nội bộ.Gỡ lỗi từ xa Java, nó hoạt động như thế nào về mặt kỹ thuật?

Giả định của tôi: Nó được thực hiện thông qua tính năng JVM trong đó tiến trình đang tải xuống/sử dụng mã nguồn từ trình gỡ lỗi từ xa đính kèm (như IDE) Nó biết dòng của dấu vết ngăn xếp hiện tại và sau đó có thể nhảy đến điểm ngắt IDE tương ứng. Giao tiếp của stack-trace và introspection của trạng thái ứng dụng sau đó được thực hiện thông qua các socket hoặc bộ nhớ chia sẻ (thiết lập của trình gỡ lỗi từ xa).

Có bất kỳ liên kết/tài nguyên thú vị nào về điều đó không?

Trả lời

35

Tính năng gỡ lỗi của JVM được cung cấp qua Java Platform Debugger Architecture (JPDA).

Các JPDA bản thân bao gồm các nội dung sau:

  • Java Virtual Machine Interface Tool (JVM TI) - giao diện lập trình bản địa cho các công cụ để sử dụng. Giao diện này cho phép kiểm tra trạng thái và giúp kiểm soát luồng thực thi bên trong debuggee.
  • Giao thức dây gỡ lỗi Java (JDWP) - được sử dụng để xác định giao tiếp giữa trình gỡ lỗi và quy trình gỡ rối.
  • Giao diện gỡ lỗi Java (JDI) - giao diện này cho phép các nhà phát triển công cụ viết các ứng dụng trình gỡ lỗi từ xa.

Sơ đồ được liệt kê trong JPDA architecture structure là điểm khởi đầu tốt. Địa điểm bổ sung cần tìm sẽ là guides listed in the JPDA page.

+0

Cảm ơn, là một giá trị đáng đọc. Chỉ cần quan tâm tôi sẽ cố gắng sử dụng thư viện jdi.jar để trực tiếp xem gỡ lỗi trong hành động. –

+2

@manuel, nếu bạn có thời gian và kiên nhẫn, hãy xem mã nguồn của JSwat (http://code.google.com/p/jswat/). Nó được xây dựng trên nền tảng Netbeans, và phục vụ như một ứng dụng front-end như xa như JPDA là có liên quan. Tôi phải thừa nhận rằng bản thân tôi không xem xét các nguồn. –

9

Kiến trúc gỡ lỗi của Java được gọi là JPDA. Bạn có thể muốn đọc JPDA documentation. Cụ thể, các Walk-through section cho một ví dụ về một IDE interfacing với JDI để có được một giá trị trên stack.

7

Gỡ lỗi Eclipse bắt đầu với những gì được gọi là Đại lý.

JVM, chạy các nguồn ".class" được tuân thủ có tính năng cho phép các thư viện bên ngoài (viết bằng Java hoặc C++) được chèn vào JVM, trong thời gian chạy. Các thư viện bên ngoài này được gọi là Đại lý và chúng có khả năng sửa đổi nội dung của các tệp .class được chạy. Các đại lý này có quyền truy cập vào chức năng của JVM không thể truy cập từ bên trong một mã Java thông thường đang chạy bên trong JVM và chúng có thể được sử dụng để thực hiện các công cụ thú vị như tiêm và sửa đổi mã nguồn đang hoạt động, lược tả vv Một số công cụ như JRebel để thay thế mã nóng) sử dụng phần chức năng này để đạt được phép thuật của họ.

Và để vượt qua một Agent Lib để một JVM, bạn làm như vậy qua bắt đầu lên đối số, bằng cách sử dụng -

agentlib:libname[=options] 

Chúng tôi đã thực sự đi qua một Agent Lib tên jdwp để JVM chạy Tomcat. Jdwp là một JVM cụ thể, tùy chọn thực hiện của JDWP (Java Debug Wire Protocol) được sử dụng để xác định truyền thông giữa một trình gỡ lỗi và một JVM đang chạy. Đó là triển khai, nếu hiện tại được cung cấp dưới dạng thư viện gốc của JVM dưới dạng jdwp.so hoặc jdwp.dll

Vì vậy, nó sẽ làm gì? Nói một cách đơn giản, tác nhân jdwp mà chúng ta truyền về cơ bản phục vụ chức năng là một liên kết giữa cá thể JVM đang chạy một ứng dụng và một Debugger (có thể được định vị từ xa hoặc cục bộ).Vì nó là một thư viện tác nhân, nó có khả năng chặn mã đang chạy, tạo một cầu nối giữa JVM và trình gỡ rối, và có chức năng của một trình gỡ lỗi được áp dụng trên JVM. Vì trong kiến ​​trúc JVM, chức năng gỡ rối không được tìm thấy trong chính JVM nhưng được trừu tượng hóa thành các công cụ bên ngoài (được gọi là debuggers), các công cụ này có thể nằm trên máy cục bộ đang chạy JVM đang được gỡ rối hoặc chạy từ máy bên ngoài. Đây là kiến ​​trúc mô-đun, ghép đôi, cho phép chúng ta có một JVM chạy trên một máy từ xa và sử dụng JDWP, có một trình gỡ rối từ xa có thể giao tiếp với nó.

Đó là cách trình gỡ lỗi Eclipse hoạt động trong ngắn hạn.

+1

Thực ra tôi hiểu nguyên tắc cơ bản của JVM. Nhưng không rõ ràng khi nhà phát triển đặt một breakpoint trên một số dòng trong nhật thực, làm thế nào nó hoạt động? Ngoài ra mã cần phải được biên dịch tại hộp địa phương để gỡ lỗi ứng dụng từ xa từ xa? –

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