Java Remote Debugging. Debug ứng dụng Java chạy trên máy tính khác.

**Bài viết này dành cho các bạn đang sử dụng IntelliJ ** 1. Đặt vấn đề Trong một số trường hợp, ứng dụng của bạn chạy trên máy local, nhưng gặp lỗi trên môi trường khác (test, production). Thông thường mình sẽ làm như sau: Thêm Log vào các khu vực nghi ngờ để kiểm

**Bài viết này dành cho các bạn đang sử dụng IntelliJ **

1. Đặt vấn đề

Trong một số trường hợp, ứng dụng của bạn chạy trên máy local, nhưng gặp lỗi trên môi trường khác (test, production).
Thông thường mình sẽ làm như sau:

  • Thêm Log vào các khu vực nghi ngờ để kiểm tra, rồi check log (cách thông dụng)
  • Lấy code nhánh bị lỗi, cố gắng chạy local để kiểm tra (Khó thực hiện, có thể bị hạn chế với network policy, các biến môi trường có thể khác, đôi khi không chính xác 100%).

Mình sẽ đưa ra thêm một cách nữa (Remote Debugging in IntelliJ) giúp chúng ta có thể debug được ứng dụng đang chạy.

2. Giải pháp

2.1 Run ứng dụng ở chế độ debug

Mình có tạo 1 simple service
Khi chạy nó sẽ export 1 api /test/get

@RequestMapping("/test")
public class TestController {
    @GetMapping("/get")
    public String getData(){
        LocalDateTime localDateTime = LocalDateTime.now();
        return localDateTime.toString();
    }
}

Bước 1 clone project về.
Vào thư mục, build jar file

cd RemoteDebuggingIntelliJ
mvn clean package 

Kết quả được file Jar ở thư mục

target/RemoteDebuggingIntelliJ-0.0.1-SNAPSHOT.jar

Bạn có thể chạy file jar ở 1 máy khác trên mạng internet, mạng lan hay chính localhost.
Để cho phép debug, chúng ta sẽ phải thêm vài option vào để chạy.
với java 5-8

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

JDK 9 and later

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

Port 5005 có thể thay bằng port khác

Trong trường hợp này mình sử dụng java 11.
câu lệnh của mình sẽ là

java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 RemoteDebuggingIntelliJ-0.0.1-SNAPSHOT.jar 

Ứng dụng được start và listen socker ở port 5005

image.png

2.2 Run IntelliJ để debug ứng dụng

Mở project trên IntelliJ, chọn Edit Configuration
image.png

Add new configuration, chọn Remote JVM Debug
image.png

Configure Host (Server chạy ứng dụng ) Port 5005 ở trên -> Apply
image.png

Sau khi start ứng dụng, nếu thành công sẽ có message kiểu này (34.124.158.186 là server mình chạy ứng dụng).
Connected to the target VM, address: '34.124.158.186:5005', transport: 'socket'image.png

Đặt break point và call api thử tới service mình đang chạy. (của mình sẽ call đến http://34.124.158.186:8080/test/get) Tùy vào server các bạn public ra, sẽ thay url khác nhau

Thấy Break Point is hit.
image.png

2.3 Source code

Toàn bộ source code mình có chia sẻ trên github.

3. Kết luận

Mình đưa ra thêm 1 cách để các bạn có thể giải quyết khi gặp vấn đề, tùy từng bài toán sẽ chọn cách phù hợp. Không có cách nào là tốt nhất.
Nếu cần trao đổi, mọi người hãy bình luận bên dưới.
Cảm ơn vì đã đọc bài của mình.

4. Tài liệu tham khảo

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ