Các kĩ thuật Debug chương trình nhúng với Keil C

debug

Trên con đường thành công thì rất nhiều sỏi đá, còn trên con đường trở thành lập trình viên thì rất nhiều Bug. Debug là một thước đo võ công của một ông lập trình viên, càng Pro thì debug càng giỏi. Trong bài này chúng ta sẽ tìm hiểu Bug và cách Debug nhé

Kĩ năng nâng cao trong Serie Học lập trình từ A tới Z

Bug là gì?

Bug là những lỗi logic hoặc hệ thống khi chương trình chạy tạo ra, khiến nó đi sai lệch so với hướng lập trình ban đầu. Hoặc cũng có thể làm treo, chậm hệ thống … Bug cũng giống như tên của nó, là một con Bọ sẵn sàng gặm nhấm, phá hủy hệ thống của bạn nếu không fix.

via GIPHY

Bugs luôn tiềm ẩn ở mọi nơi, và ta không thể lường trước được mọi tình huống có thể xảy ra mà chỉ có thể cố gắng làm giảm nó đến mức thấp nhất có thể tùy vào khả năng của ta tại thời điểm phát triển và bảo trì ứng dụng.

Đôi khi một chương trình có quá nhiều Bug mà ko thể fix kịp, lập trình viên hay nói:

Đó không phải là Bug, đó là tính năng

Trong thực tế, cũng có rất nhiều sản phẩm nhà sản xuất cố tính giữ lại các Bug đó, và coi đó là 1 tính năng thú vị. Thường thấy nhất trong Game. Nhưng đa số Bug thì phải tìm và diệt và quá trình đó gọi là Debug.

Debug là gì?

Nói đơn giản Debug là quá trình tìm kiếm và tiêu diệt Bug. Công việc Debug chiếm phần lớn thời gian khi tạo ra 1 sản phẩm, thực tế code ra 1 sản phẩm không mất quá nhiều thời gian. Thế nhưng tìm diệt hết các Bug để chương trình chạy ổn định thì lại không hề đơn giản chút nào.

Bug len lỏi trong các câu lệnh của bạn, đôi khi chỉ là sai 1 dấu toán tử, sai 1 chữ trong tên biến … nhưng hậu quả để lại thì khôn lường. Việc tìm kiếm chúng trong hàn ngàn, hoặc chục ngàn dòng lệnh không hề đơn giản chút nào.
Vậy nên mới cần các kĩ thuật Debug. Trong phạm vi bài này, chúng ta sẽ nói tới việc Debug trương trình nhúng sử dụng IDE Keil C

Các kĩ thuật Debug chương trình nhúng

Trước hết để hiểu rõ hơn về viêc debug thì các bạn nên hiểu 1 chương trình nhúng sẽ hoạt động như thế nào. Trình biên dịch hoạt động như thế nào. Bạn có thể tham khảo bài viết: Quá trình biên dịch của 1 chương trình C/C++

Trong chương trình C các câu lệnh sẽ được biên dịch theo kiểu Top Down ( từ trên xuống) Các câu lệnh bên trên sẽ được thực hiện trước sau đó đến các câu lệnh bên dưới.

Hãy cùng tham khảo các kĩ thuật Debug này nhé

Các kĩ thuật dùng Debug Tools

Khi nhấn nút Debug trên phần mềm chúng ta sẽ được chuyển tới giao diện deBug

 

Giao diện bao gồm những thành phần chính sau

 

Kĩ thuật 1: Break Point và Run Step by Step

Chương trình luôn chạy liên tục với tốc độ cực nhanh, khi muốn dừng ta phải chọn 1 điểm dừng cho nó. Khi chương trình dừng lại, giá trị của tất cả các thanh ghi, biến, bộ nhớ …. đều được lưu lại tại thời điểm đó.

Cách sử dụng: Click vào điểm bên ngoài thứ tự code, hiện một hình tròn màu đỏ là được.

Sau khi đặt Break Point chúng ta nhấn nút Debug để vào chế độ Debug. Sử dụng công cụ Run (F5), khi chương trình chạy đến Break Point sẽ tự động dừng lại.

Ngoài ra các bạn có thể sử dụng các chế độ Step, Step over, Step out để chạy từng bước cho chương trình. Giúp bắt lỗi tại những khoảng code nghi ngờ.

Kĩ thuật này phối hợp rất tốt với các kĩ thuật Watch sau đây.

Kĩ thuật 2: Watch Window

Chương trình hoạt động đẫn tới sự thay đổi về biến, bộ nhớ, thanh ghi … Để có thể nhìn thấy sự thay đổi này, xem xem chúng có thay đổi đúng theo Logic không, ta sử dụng Watch.

Watch Memory

Chuyển qua tab Memory, sau đó gõ địa chỉ cần view. Với công cụ này chúng ta có thể xem được trực tiếp giá trị của bộ nhớ bên trong mcu

Watch Register

Xem register cũng rất quan trọng trong quá trình debug, các bạn phải nắm rõ cách ngoại vi hoạt động sau khi đối chiếu với sự thay đổi của thanh ghi mới biết rõ chúng có hoạt động đúng hay không

Chọn Thanh Ghi
Cửa sổ xem thanh ghi

Watch Variable

Với các biến ta sử dụng cửa số Watch, sau đó Add biến cần xem vào.

Lưu ý: Chúng ta chỉ xem được khai báo toàn cục ( lưu ở phần data) chứ ko thể xem được biến cục bộ. Nếu muốn xem biến cục bộ, bạn có thể dùng phương pháp Log nhé

Các kĩ thuật Debug khác

Kĩ thuật 1: Tạo lưu đồ giải thuật

Muốn chương trình it Bug thì Đừng tạo ra nhiều Bug ngay từ đầu

Hãy rõ ràng ngay từ khâu phát triển chương trình bằng các lưu đồ giải thuật. Và các thiết kế hệ thống như: States Machine …. Việc không có các tài liệu về thiết kế hệ thống sẽ tạo ra Bug ngay từ khâu thiết kế. Và các Bug này thì thường siêu to khổng lồ, có thể bạn phải đập cả hệ thống đi và xây lại đó

Kĩ thuật 2: In log hay Logging (nhật kí chương trình)

Bạn có thường thấy, khi cài đặt chương trình trên Window thường có các ô hiện lên: Coping file …, install success, install fail … Các dòng text này được in ra liên tục giúp bạn biết được chương trình đã cài đặt tới đâu rồi.

Trong lập trình đó gọi là Log hay kĩ thuật Logging.

Trong hoặc sau khi thực hiện một tác vụ bất kì ta có thể in ra 1 đoạn văn bản thông báo, nếu trương trình bị treo thì bạn chỉ cần tìm tới nơi in ra đoạn văn bản cuối cùng của log đó và tìm kiếm xung quanh nó.

Bạn có thể sử dụng toán tử tiền xử lý  để có thể bỏ đi các đoạn log khi không cần thiết nữa.

Ví dụ:

#define DEBUG_MOD 1
#ifdef DEBUG_MOD
   println(" In Log tại đây");
#endif

 

Trong ví dụ này khi bạn bỏ dòng #define DEBUG_MOD 1 tất cả các dòng lệnh trong #ifdef tới #endif đều bị xóa trong khi thực thi tiền xử lý ( không làm nặng chương trình). cấu trúc ifdef và endif có thể dùng nhiều chỗ khác nhau trên trương trình mà chỉ cần define 1 lần.

Kĩ thuật 3: Find to Define

Tìm kiếm nơi định nghĩa: Khi bạn sử dụng 1 hàm hoặc một biến bất kì, đôi khi bạn quên nó dùng như thế nào hoặc biến đó có giá trị ra sao. Có thể sử dụng Find to Define để nhảy trực tiếp tới nơi định nghĩa nó.

Việc này giảm tối đa thời gian bạn đi tìm trong cả ngàn dòng code và vài chục file khác nhau trong 1 chương trình.

Đây là một công cụ mình rất hay sử dụng, cũng là công cụ Arduino IDE ko có ( Thế nên mình không thích sử dụng Arduino IDE).

Kĩ thuật 4: Viết Clean Code

Nói cho cùng, bạn không thể nào Debug 1 mình được, vậy nên khi code Clean người khác mới có thể hiểu được bạn đang viết gì, theo đó có thể giúp bạn được. Thử tưởng tượng bạn đặt các biến toàn là a,b,c,d sau đó ngầm hiểu nó dùng làm gì, thì người sau đọc code bạn có hiểu được không?

Vậy nên hãy giữ cho mình sự sạch sẽ, để không có bọ trên người nhé

Kĩ thuật 5: Vác code đi hỏi cao nhân

Đôi khi mò mẫm trong bóng tối quá lâu cũng sẽ làm bạn nản lòng, những thứ bạn thấy thật khó khăn lại là những thứ cực kì đơn giản, mà chỉ có những người giàu kinh nghiệm mới nhìn ra được.

Chả thế mà các cao nhân đều là các bậc tiền bối, có tuổi đời và tuổi nghề lâu năm. Hãy cố gắng đi tìm người Mentor cho mình, đảm bảo việc học và làm việc sẽ rất suôn sẻ đó.

Nhưng lưu ý: Kĩ thuật này chỉ nên sử dụng khi bạn đã làm hết các kĩ thuật ở trên mà không ra được. Chả ai muốn họ bị làm phiền quá nhiều bởi những câu hỏi hiển nhiên cả. Hãy nhớ Google trước khi đi hỏi nhé!

Kết

Debug là một quá trình gian khổ, mệt mỏi. Thế nhưng kĩ năng nào cũng cần rèn luyên, hãy chăm chỉ tập luyện, rồi một ngày nào đó bạn cũng sẽ trở thành 1 Dũng Sĩ Diệt Bug. Cám ơn bạn đã đón đọc, cùng vào hội Anh Em Nghiện Lập Trình để cùng trao đổi nhé

4.7/5 - (4 bình chọn)

5 những suy nghĩ trên “Các kĩ thuật Debug chương trình nhúng với Keil C

  1. Hieu nói:

    Trong khi chương trình đang running ở chế độ debug thì có thể stop lại ở một breakpoint mà mình click vào không ? Mình sử dụng IAR thấy việc debug rất ngon lành, đang debug mà muốn stop lại dòng mong muốn thì chỉ cần click set breakpoint ở dòng đó, nhưng khi dùng Keil C thì không được.

  2. Nguyễn Văn Anh nói:

    công việc khô khan, đọc mấy bài như này của a có đoạn kết làm e sực mỉm cười. Hóa ra cũng có chút thú vị trong chút nhàm chán “rồi một ngày nào đó bạn cũng sẽ trở thành 1 Dũng Sĩ Diệt Bug”. cảm ơn những bài viết chia sẻ hữu ích của a. Chúc a 1 ngày tốt lành
    

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *