- vừa được xem lúc

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

0 0 29

Người đăng: LDT

Theo Viblo Asia

**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

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tổng hợp các bài hướng dẫn về Design Pattern - 23 mẫu cơ bản của GoF

Link bài viết gốc: https://gpcoder.com/4164-gioi-thieu-design-patterns/. Design Patterns là gì. Design Patterns không phải là ngôn ngữ cụ thể nào cả.

0 0 302

- vừa được xem lúc

Học Spring Boot bắt đầu từ đâu?

1. Giới thiệu Spring Boot. 1.1.

0 0 278

- vừa được xem lúc

Cần chuẩn bị gì để bắt đầu học Java

Cần chuẩn bị những gì để bắt đầu lập trình Java. 1.1. Cài JDK hay JRE.

0 0 50

- vừa được xem lúc

Sử dụng ModelMapper trong Spring Boot

Bài hôm nay sẽ là cách sử dụng thư viện ModelMapper để mapping qua lại giữa các object trong Spring nhé. Trang chủ của ModelMapper đây http://modelmapper.org/, đọc rất dễ hiểu dành cho các bạn muốn tìm hiểu sâu hơn. 1.

0 0 194

- vừa được xem lúc

[Java] 1 vài tip nhỏ khi sử dụng String hoặc Collection part 1

. Hello các bạn, hôm nay mình sẽ chia sẻ về mẹo check String null hay full space một cách tiện lợi. Mình sẽ sử dụng thư viện Lớp StringUtils download file jar để import vào thư viện tại (link).

0 0 71

- vừa được xem lúc

Deep Learning với Java - Tại sao không?

Muốn tìm hiểu về Machine Learning / Deep Learning nhưng với background là Java thì sẽ như thế nào và bắt đầu từ đâu? Để tìm được câu trả lời, hãy đọc bài viết này - có thể kỹ năng Java vốn có sẽ giúp bạn có những chuyến phiêu lưu thú vị. DJL là tên viết tắt của Deep Java Library - một thư viện mã ng

0 0 139