Cách chạy và debug với Intellij
Back To Blogs1. Debug là gì
Hầu hết các IDE và một số text editor đã có debugger. Debugger là một tool siêu hữu ích để thực hiện việc debug - tìm và fix các lỗi trong chương trình. Nói vậy thôi chứ mục đích của debugger còn nhiều hơn thế:
Theo dõi luồng chạy chương trình (nếu chương trình bị stop đột ngột thì debug có thể biết được dòng nào bị lỗi)
Xem giá trị các biến, object phức tạp dễ dàng
Xem các log được in ra console, call stack,...
2. Debug thế nào
Các IDE khác nhau sẽ có debugger khác nhau, nên sẽ có một tí khác biệt. Nhưng chung quy lại thì debug chỉ gồm một số bước sau:
- Đặt breakpoint ở các dòng cần tạm dừng để debug
- Chạy chương trình với debug mode
- Thao tác với chương trình, sao cho chạy tới chỗ đặt breakpoint
- Khi IDE dừng tại breakpoint, thì thực hiện xem value các biến, xem log,... để kiểm tra bug.
- Sau đó đi tiếp từng dòng code tiếp theo, xem sự thay đổi các biến sau từng câu lệnh
- Tiếp tục chạy chương trình bình thường, hoặc dừng chương trình.
2.1. Breakpoint
Là thứ được đánh dấu lên dòng code, khi chương trình chạy tới dòng có breakpoint thì sẽ bị tạm dừng. Lúc này bạn có thể dùng các tool của debugger để xem giá trị các biến, xem log,... Hoặc bạn có thể đi tiếp từng dòng tiếp theo, hoặc cho chương trình chạy bình thường (không bị tạm dừng nữa).
Cách đặt breakpoint: Click chuột vào lề trái của dòng đó. Lúc này breakpoint sẽ được toggle, click thêm lần nữa để xóa (như hình).

Breakpoint thường là có dạng hình tròn màu đỏ, dấu tròn này có thể khác đôi chút để biểu thị trạng thái breakpoint (đã được đi qua hay chưa). Khi chương trình tạm dừng tại breakpoint thì dòng đó sẽ được highlight.
Dòng code được highlight sẽ chưa thực hiện, chỉ khi bạn đi tiếp qua dòng khác thì dòng trước đó mới được thực thi.
2.2. Local variables và watches
Khi chương trình dừng tại breakpoint, chúng ta có thể dùng 2 tool là Local variables và watches để xem giá trị các biến:
- Local variables chỉ để xem các biến trong function hiện tại (local). Khi qua function khác thì danh sách biến sẽ được update lại.
- Watch dùng để xem các biến global, hoặc bất cứ biến nào. Value của watch được theo dõi ngay cả khi chương trình dừng.
Local variables thì sẽ tự động update danh sách biến trong function. Tuy nhiên, với watch thì bạn phải tự thêm các biến vào thủ công (chuột phải vào biến, Add to watches).
IntelliJ IDEA gộp chung 2 tools trên lại thành Variables.

2.3. Step over, các step khác, stop/resume program

Theo thứ tự từ trái sang ta có các nút:
- Nút Rerun
: Nút này dùng để chạy lại toàn bộ phiên gỡ lỗi. Khi nhấp vào, chương trình sẽ được khởi động lại từ đầu ở chế độ gỡ lỗi, cho phép lập trình viên bắt đầu lại quá trình kiểm tra mã.
- Nút Stop Debugging
: Nút này dừng hoàn toàn phiên gỡ lỗi. Khi nhấn, chương trình sẽ bị chấm dứt và cửa sổ gỡ lỗi sẽ đóng lại, kết thúc quá trình debug.
- Nút Resume Program
: Nút này tiếp tục thực thi chương trình sau khi nó bị tạm dừng tại một điểm dừng (breakpoint). Khi nhấn, chương trình sẽ chạy tiếp cho đến khi gặp điểm dừng tiếp theo hoặc hoàn thành quá trình thực thi.
- Nút Pause Program
: Nút này tạm dừng việc thực thi chương trình đang chạy. Nó hữu ích khi lập trình viên muốn kiểm tra trạng thái của chương trình (ví dụ: giá trị biến) tại một thời điểm cụ thể mà không cần đặt điểm dừng trước.
- Nút Step Over
: Nút này cho phép "bước qua" dòng mã hiện tại. Khi nhấn, dòng mã hiện tại sẽ được thực thi và con trỏ chuyển sang dòng tiếp theo trong cùng phương thức, mà không đi sâu vào bất kỳ lời gọi phương thức nào trên dòng đó.
- Nút Step Into
: Nút này dùng để "bước vào" một lời gọi phương thức. Nếu dòng mã hiện tại chứa một phương thức, nhấn nút này sẽ đưa trình gỡ lỗi vào bên trong phương thức đó, cho phép kiểm tra từng dòng mã bên trong.
- Nút Step Out
: Nút này giúp "bước ra" khỏi phương thức hiện tại. Khi đang gỡ lỗi bên trong một phương thức, nhấn nút này sẽ thực thi các dòng còn lại của phương thức và quay lại phương thức đã gọi nó.
- Nút View Breakpoints
: Nút này mở cửa sổ "Breakpoints", nơi lập trình viên có thể xem, quản lý và cấu hình tất cả các điểm dừng trong dự án. Tại đây, bạn có thể bật/tắt điểm dừng hoặc thiết lập điều kiện để chương trình dừng lại khi cần.
- Nút Mute Breakpoints
: Nút này bật/tắt chế độ "tắt tiếng" cho các điểm dừng. Khi được kích hoạt, chương trình sẽ chạy mà không dừng lại tại bất kỳ điểm dừng nào, tạm thời vô hiệu hóa chúng mà không cần xóa.
2.4 Chạy debug

- "Main" ở đây là tên của lớp (class) hiện tại chứa phương thức main, được chọn làm điểm khởi đầu để chạy hoặc gỡ lỗi chương trình.
- Nút Run
: Nút này dùng để chạy chương trình từ lớp "Main" mà không cần gỡ lỗi (chạy ở chế độ thông thường).
- Nút Debug
:Nút này kích hoạt chế độ gỡ lỗi (debug) cho lớp "Main". Khi nhấn, chương trình sẽ chạy với khả năng dừng tại các điểm dừng (breakpoints), cho phép bạn kiểm tra giá trị biến, luồng thực thi, và tìm lỗi.
3. Tóm lại
Debugging là một kỹ năng quan trọng trong lập trình, giúp bạn tìm và sửa lỗi một cách hiệu quả. Với các công cụ như debugger trong IntelliJ IDEA, bạn có thể dễ dàng kiểm soát luồng thực thi của chương trình, theo dõi giá trị biến, và phân tích hành vi mã nguồn.