🌱 Kỹ thuật Debug nâng cao
Debug là một công cụ/kỹ thuật rất quan trọng đối với các lập trình viên nói chung và các lập trình viên nhúng nói riêng. Đôi khi việc debug không được nhắc đến nhiều, ngay cả trong các đợt phỏng vấn của các công ty, họ cũng sẽ không hỏi những câu như "Bạn có thường xuyên debug không?" hay "Hãy nêu những kỹ thuật debug cơ bản!".
Thực tế người ta sẽ đánh giá khả năng debug của bạn thông qua các câu hỏi như "Bạn thường gặp những lỗi gì khi lập trình", "Bạn đã từng gặp lỗi xxx chưa?". Vậy debug là gì và nó có quan trọng không?
👉 Bug là gì?
Bug là một khái niệm chỉ những lỗi nói chung trong một chương trình phần mềm (Tạm không nói đến những lỗi phần cứng). Thực tế cũng có một khái niệm tiêu chuẩn cho Bug, nhưng chúng ta cũng thường không để tâm, mà sẽ đi vào tìm hiểu những trường hợp thực tế của nó.
Đối với chương trình phần mềm khác nhau thì có nhiều kiểu bug khác nhau, nhiều loại bug khác nhau. Mình sẽ nêu ra một vài Bug như sau:
- Bug giao diện
Đối với các phần mềm Web/App, chúng ta thường có các lỗi về mặt giao diện người dùng (GUI). Các lỗi có thể gặp như hiển thị sai, timeout khi click button, các tính năng hoạt động không đúng, ...
Chưa nói đến các lỗi nghiêm trọng thì dưới đây là một ví dụ đơn giản về lỗi giao diện hoạt động không đúng yêu cầu. Đó là ComboBox chọn Baudrate của một App setup cho UART, bug ở đâu là thiếu mất các baudrate có thể được sử dụng như 115200.
- Bug syntax
Bug này thường gặp trong quá trình Compile, đối với các ngôn ngữ biên dịch, và quá trình Run-time đối với các ngôn ngữ thông dịch.Ở đây chúng ta sẽ nhắc đến C, một ngôn ngữ biên dịch, chúng ta có thể gặp các lỗi cú pháp như: sai cú pháp, đặt tên biến trùng keyword, thiếu dấu chấm phẩy, thiếu dấu ngoặc, ... Đối với Bug này thì đơn giản chương trình sẽ bị build fail.
⇒ Đối với Bug syntax thì sẽ phát hiện trong quá trình compile nên khá đơn giản.
- Bug Run-time
Bug này thường gặp trong quá trình Run-time, tức là build ok nhưng khi run thì mới có lỗi (chạy sai yêu cầu, timeout, treo trong vòng lặp, ...). Các lỗi này có thể nguyên nhân do thiết kế chương trình sai, code sai design, ...
Đối với loại bug này, nếu chương trình đơn giản thì developer dễ dàng nhận ra hoặc dự đoán được vị trí gây lỗi. Tuy nhiên nếu chương trình lớn thì sẽ rất khó để làm như vậy. Lúc đó chúng ta sẽ cần đi sâu vào chương trình, đi vào từng file, từng hàm, thậm trí là từng câu lệnh Assembly để tìm ra lỗi cụ thể.
⇒ Đối với Bug này thì buộc chúng ra cần quá trình debug.
👉 Debug là gì?
Debug là quá trình tìm kiếm và phát hiện ra lỗi cũng như nguyên nhân gây ra các lỗi này để có hướng sửa lỗi (fix bug). Việc kiểm soát lỗi của hàng ngàn dòng code là việc không hề đơn giản đối với các nhà lập trình viên, nhất là những người chưa có nhiều kinh nghiệm.
Debug không chỉ là để loại bỏ những lỗi (error) khỏi chương trình mà còn hỗ trợ các lập trình viên hiểu rõ hơn về chương trình, phần mềm đang chạy. Chính vì vậy, debug cũng là một khả năng được sử dụng để đánh giá trình độ của lập trình viên.
👉 Các kỹ thuật Debug
Các debugger đều hỗ trợ cho chúng ta nhiều công cụ để phục vụ quá trình debug. Chúng ta có thể điểm qua một số công cụ như dưới đây:
- BreakPoint (Set điểm dừng cho chương trình để ngay lập tức nhảy đến một câu lệnh, hoặc check xem chương trình có nhảy đến câu lệnh đó hay không).
- Step Over, Step Into (Nhảy qua một hàm/câu lệnh, hoặc đi vào trong hàm/câu lệnh).
- Add Watch (Xem giá trị các biến, biểu thức, thanh ghi, ô nhớ, ...).
Đối với việc phát triển một chương trình phần mềm, đôi khi việc debug còn chiếm nhiều thời gian và quan trọng hơn cả việc code. Các kỹ thuật debug thì khá dễ hiểu và dễ học, tuy nhiên kinh nghiệm debug là thứ không thể học được ngay lập tức, mà cần mất thời gian thực hành.
Chính vì vậy, mình sharing video dưới đây để các bạn có thể nắm được các kỹ thuật debug chính với vi điều khiển, còn lại để phát triển thì các bạn cần phải thực hành nhiều hơn với các bài toán khác nhau.
👉 Video về kỹ thuật Debug nâng cao
Chúc các bạn học tập tốt 😊