Tản mạn về debugger - DAP là gì?

2 months ago

Mấy hôm nay chuyển từ VSCode sang sử dụng Zed vì một số lý do. Zed là một trình soạn thảo mã viết bằng Rust rất nhẹ và có giao diện tương đồng với VSCode ở nhiều chỗ. Tuy vậy Zed vẫn có những điểm khác biệt và đi theo triết lý riêng của họ. Cá nhân mình đã sử dụng Zed từ những ngày đầu ra mắt, ấn tượng ban đầu là rất nhanh và mượt. Tuy nhiên rất nhiều tính năng quen dùng trên VSCode lại không có trên Zed nên chỉ dừng lại ở mức trải nghiệm.

Một trong những tính năng mình thường xuyên sử dụng là debug bằng breakpoint, chọn vị trí rồi quan sát luồng dữ liệu trong hệ thống. VSCode là trình soạn thảo phổ biến cho nên bật debug dễ dàng hơn nhiều. Thường chỉ mất vài thao tác, đặc biệt nếu sử dụng framework thì bạn còn dễ dàng tìm thấy hướng dẫn trên mạng. Nói chung là VSCode làm rất tốt việc tối giản cho người sử dụng.

Vì vậy sau khi chuyển sang Zed mình cũng cần phải thiết lập debug, lúc này câu hỏi đặt ra là thiết lập debug trong Zed có giống với VSCode? Chắc chắn là không rồi, vì chúng không phải cùng một người tạo ra. Vậy thì tại sao chúng lại khác nhau? Bạn có thắc mắc rằng tại sao có những trình soạn thảo hỗ trợ debug, có cái lại không? Với cả trong trường hợp không có trình soạn thảo thì liệu chúng ta có cách nào để debug nữa hay không? Hoá ra có thể trả lời tất cả câu hỏi này nếu nắm được điều cốt lõi của kỹ thuật debug.

Trước tiên hãy nói về phía ngôn ngữ lập trình, hầu hết chúng đều triển khai một trình gỡ lỗi tích hợp trong lõi, kích hoạt bằng cách nào đó như là thêm cờ --debug hoặc đối với Node.js là --inspect. Sau khi bật, bạn có thể phải thêm vài đoạn mã báo hiệu điểm dừng (giống như đặt breakpoint), rồi dùng lệnh để lắng nghe dữ liệu tại điểm đó. Với một số ngôn ngữ, người ta còn tạo ra vài công cụ hỗ trợ debug dễ dàng hơn thông qua giao diện trực quan, điển hình như node-inspector hay là devtools-frontend có sẵn trong nhân của trình duyệt Chrome. Nhưng nếu mỗi ngôn ngữ tạo ra công cụ riêng thì các trình soạn thảo mã cũng phải tạo ra giao diện debug riêng cho mỗi thứ?

Rất may câu trả lời là không cần thiết vì người ta "chế" ra một cái gọi là Debug Adapter Protocol (DAP) - là một giao thức chuẩn để giao tiếp giữa trình soạn thảo và debugger server. Khi cả 2 triển khai giao thức này thì việc tương tác giữa chúng đơn giản hơn rất nhiều. Trình soạn thảo không phải tạo ra giao diện debug cho mỗi ngôn ngữ, còn ngôn ngữ chỉ cần tạo ra debugger server đúng chuẩn, ráp lại với nhau là chúng hoạt động.

Nói tóm lại là Zed đã triển khai DAP và dĩ nhiên Node.js cũng có debugger server tuân theo DAP nên có thể debug một cách dễ dàng. DAP chỉ là giao thức, là cách nói chuyện giữa trình soạn thảo và debugger server, còn về phần giao diện và cấu hình thì do trình soạn thảo quyết định, tuy nhiên theo quan sát giữa chúng vẫn có sự tương đồng nhất định. Ở bài viết tiếp theo mình sẽ đi tiếp vào phần này nhé.