Java Remote Debugging. Debug ứng dụng Java chạy trên máy tính khác.
Bài đăng này đã không được cập nhật trong 2 nă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
2.2 Run IntelliJ để debug ứng dụng
Mở project trên IntelliJ, chọn Edit Configuration
Add new configuration, chọn Remote JVM Debug
Configure Host (Server chạy ứng dụng ) Port 5005 ở trên -> Apply
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'
Đặ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.
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
All rights reserved