Giả sử bạn đã viết một chương trình và nó không hoạt động chính xác – tất cả code đều biên dịch tốt, nhưng khi bạn chạy nó, bạn sẽ nhận được kết quả không chính xác. Bạn phải có một lỗi ngữ nghĩa ở đâu đó. Làm thế nào bạn có thể tìm thấy nó? Nếu bạn đã theo dõi các thực tiễn tốt nhất bằng cách viết một ít code và sau đó kiểm tra nó, bạn có thể biết được lỗi của mình ở đâu. Hoặc bạn có thể không có manh mối nào cả.

Tất cả các lỗi bắt nguồn từ một tiền đề đơn giản: Một cái gì đó mà bạn nghĩ là chính xác, không phải. Trên thực tế, việc tìm ra lỗi đó có thể là thách thức. Trong bài học này, chúng ta sẽ phác thảo quá trình chung để gỡ lỗi một chương trình.

Bởi vì chúng ta chưa đề cập đến nhiều chủ đề C ++, các chương trình ví dụ của chúng ta trong chương này sẽ khá cơ bản. Điều đó có thể làm cho một số kỹ thuật chúng ta hiển thị ở đây có vẻ quá mức. Tuy nhiên, hãy nhớ rằng các kỹ thuật này được thiết kế để được sử dụng với các chương trình lớn hơn, phức tạp hơn và sẽ được sử dụng nhiều hơn trong một cài đặt như vậy (đó là nơi bạn cần chúng nhất).

Một cách tiếp cận chung để gỡ lỗi

Khi một vấn đề đã được xác định, việc gỡ lỗi(Debugging) vấn đề thường bao gồm năm bước:

  1. Tìm nguyên nhân gốc rễ của vấn đề (thường là dòng code không hoạt động)
  2. Đảm bảo bạn hiểu lý do tại sao sự cố xảy ra
  3. Xác định cách bạn sẽ khắc phục sự cố
  4. Sửa chữa sự cố gây ra
  5. Thử lại để đảm bảo sự cố đã được khắc phục và không có sự cố mới nào xuất hiện

Hãy sử dụng một sự tương tự trong cuộc sống thực ở đây. Giả sử một buổi tối, bạn đi lấy một ít đá từ máy làm đá trong tủ đá. Bạn đặt cốc của mình lên quầy pha chế, bấm và không có gì xuất hiện. À ồ. Bạn đã phát hiện ra một số khiếm khuyết. Bạn sẽ làm gì? Bạn có thể bắt đầu một cuộc điều tra để xem liệu bạn có thể xác định nguyên nhân gốc rễ của vấn đề hay không.

1. Tìm nguyên nhân gốc rễ

Vì bạn nghe thấy máy làm đá cố gắng phân phối đá, có lẽ đó không phải là cơ chế phân phối băng. Vì vậy, bạn mở tủ đông, và kiểm tra khay đá. Không có đá. Đó có phải là nguyên nhân gốc rễ của vấn đề? Không, đó là một triệu chứng khác. Sau khi kiểm tra thêm, bạn xác định rằng máy làm đá dường như không làm đá. Là vấn đề của người làm đá hay cái gì khác? Tủ đông vẫn lạnh, dòng nước không bị tắc và mọi thứ khác dường như đang hoạt động, vì vậy bạn kết luận rằng nguyên nhân gốc rễ là do máy làm đá không hoạt động.

2. Hiểu vấn đề

Điều này là đơn giản trong trường hợp này. Một nhà sản xuất đá bị hỏng sẽ không làm đá.

3. Xác định cách khắc phục

Tại thời điểm này, bạn có một số tùy chọn để khắc phục: Bạn có thể khắc phục sự cố (mua túi đá từ cửa hàng). Bạn có thể thử chẩn đoán thêm máy làm đá, để xem có bộ phận nào có thể sửa chữa được không. Bạn có thể mua một máy làm đá mới và lắp đặt nó thay cho máy làm đá hiện tại. Hoặc bạn có thể mua một tủ đông mới. Bạn quyết định mua một máy làm đá mới.

4. Khắc phục sự cố

Khi máy làm đá đã đến, bạn cài đặt nó.

5. Thử lại

Sau khi bật điện trở lại và chờ qua đêm, máy làm đá mới của bạn bắt đầu làm đá. Không có vấn đề mới được phát hiện.

Bây giờ hãy áp dụng quy trình này cho chương trình đơn giản của chúng ta từ bài học trước:

/**
* Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
*
* @author cafedevn
* Contact: cafedevn@gmail.com
* Fanpage: https://www.facebook.com/cafedevn
* Instagram: https://instagram.com/cafedevn
* Twitter: https://twitter.com/CafedeVn
* Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

#include <iostream>
 
// Adds two numbers
int add(int x, int y)
{
    return x - y; // function is supposed to add, but it doesn't
}
 
int main()
{
    std::cout << add(5, 3) << '\n'; // should produce 8, but produces 2
    return 0;
}

Code này rất hay về một khía cạnh: lỗi rất rõ ràng, vì câu trả lời sai được in ra màn hình qua dòng 22. Điều đó cho chúng ta một điểm khởi đầu cho cuộc điều tra của chúng ta.

Tìm nguyên nhân gốc: Trên dòng 11, chúng ta có thể thấy rằng chúng ta đang chuyển bằng chữ cho các đối số (5 và 3), vì vậy không có chỗ cho lỗi ở đó. Vì các đầu vào cho hàm add là chính xác, nhưng đầu ra thì không, rõ ràng là hàm add phải tạo ra giá trị sai. Câu lệnh duy nhất trong hàm add là câu lệnh return, đây phải là thủ phạm. Chúng ta đã tìm thấy dòng vấn đề. Bây giờ chúng ta biết nơi tập trung sự chú ý của mình, nhận thấy rằng chúng ta đang trừ đi thay vì thêm vào là điều bạn có thể tìm thấy thông qua kiểm tra.

Hiểu vấn đề: Trong trường hợp này, rõ ràng tại sao giá trị sai được tạo ra – chúng ta đang sử dụng toán tử sai.

Xác định cách khắc phục: Chúng ta chỉ cần thay đổi toán tử- thành toán tử + .

Khắc phục sự cố: Đây thực sự là thay đổi toán tử- thành toán tử + và đảm bảo chương trình biên dịch lại.

Thử lại: Sau khi thực hiện thay đổi, chạy lại chương trình sẽ chỉ ra rằng chương trình của chúng tôi hiện tạo ra giá trị đúng là 8. Đối với chương trình đơn giản này, đó là tất cả các thử nghiệm cần thiết.

Ví dụ này là tầm thường, nhưng minh họa quá trình cơ bản bạn sẽ trải qua khi chẩn đoán bất kỳ chương trình nào.