- vừa được xem lúc

Gỡ lỗi chương trình

0 0 30

Người đăng: BeautyOnCode

Theo Viblo Asia

Hôm nay mình muốn nói về “Gỡ lỗi”(Debugging) 🐞, một qui trình sửa lỗi trong chương trình phần mềm.

Điều quan trọng đầu tiên cần nhớ là:

Đừng cảm thấy thất vọng khi bạn tạo ra một con bug.

Khi viết một chương trình thì việc gặp bug 🐞 là việc đương nhiên 🥲, vì khi đã viết chương trình ⌨️ tức là mình đã bắt đầu một việc để tạo ra các bạn ấy cơ mà. Đó có thể là sai cú pháp, sai chính tả, chương trình không chạy đúng, …

Tiếp theo sẽ là một số mẹo và kỹ thuật để nhận dạng bug và sửa nó hiệu quả:

✍️ Mô tả vấn đề(Describe the problem)

Để fix bug, đầu tiên bạn cần mô tả được vấn đề mà mình gặp phải. Đôi khi có những vấn đề đơn giản chỉ cần bạn mô tả và kiểm tra vài thông tin liên quan là có thể sửa được rồi.

Ví dụ:

Thực hiện in ra một danh sách các số từ 1 đến 20 với print(list(range(1, 5))) nhưng kết quả nhận được lại là [1, 2, 3, 4] lại bị thiếu số 5.

Mô tả vấn đề:

Không có số 5 trong danh sách như mong đợi.

Sửa lỗi:

Để giải quyết vấn đề này sẽ cần đọc lại về hàm range, bạn sẽ thấy cú pháp là:

range(start, stop, step=1) với stop sẽ bị bỏ qua.

Do đó muốn giải quyết thì mình cần tăng stop từ 5 lên 6, tức range(1, 6)

🐞 Tái tạo lại lỗi(Reproduce the bug)

Rất nhiều khi bug chỉ thỉnh thoảng xuất hiện. Để fix được những bug như vậy lập trình viên cần biết cách tái tạo lại con bug đó và tìm hiểu chính xác vấn đề mà trường hợp đó gặp phải là gì thì mới có thể sửa lỗi được

Ví dụ:

Giả sử bạn có một danh sách: numbers = [1, 2, 3, 4, 5, 6]. Bạn muốn chọn ngẫu nhiên một số trong 6 số ở trên. Gọi choice = randint(1, 6) để chọn số từ 1 đến 6 và kết quả chọn được sẽ là numbers[choice]

Khi chạy chương trình, bạn sẽ thấy chương trình chạy ổn, tuy nhiên nếu chạy nhiều lần thì sẽ có một lỗi như thế này xuất hiện:

Traceback (most recent call last): File "main.py", line 14, in <module> print(dice_imgs[dice_num])
IndexError: list index out of range

Vậy làm sao có thể tái tạo lại lỗi này nhỉ?

Tái tạo lỗi:

Đầu tiên, choice = randint(1, 6) nên mình cần đọc lại về randint, bạn sẽ thấy nó được mô tả là sẽ trả về một số nguyên giữa khoảng 1 và 6, bao gồm cả số 1, 6.

Bạn có thể thử nghiệm bằng cách gán giá trị từ 1 đến 6 cho biến choice để thấy được là khi choice = 6 thì sẽ có lỗi trên xuất hiện.

Sửa lỗi:

Như vậy ở đây lỗi sẽ xảy ra với số 6 vì numbers có 6 phần tử với index đếm từ 0 đến 5. Do đó lỗi này sẽ được sửa với choice = randint(1, 5)

💻 Thử thực hiện chương trình như máy tính(Play computer)

Với một chương trình phức tạp như có logic với nhiều điều kiện rẽ nhánh, hay gọi nhiều hàm khác nhau, thì việc sửa lỗi sẽ càng khoai hơn. Lúc này bạn cần tưởng tượng mình là máy tính, và với đầu vào cụ thể nào đó, bạn tự kiểm tra từng dòng một của chương trình như cách máy tính chạy để tìm manh mối cho lỗi của mình.

Khi bạn sử dụng một debugger để chạy chương trình và hiển thị các kết quả ở từng dòng thì cũng chính là cách này.

🏹 Sửa lỗi(fix the errors)

Khi bạn viết chương trình, nếu trình soạn thảo(editor) hiển thị các lỗi(như hiện gạch đỏ ở nơi có lỗi)

Khi bạn chạy chương trình, nếu có lỗi hiển thị các lỗi thì bạn cũng cần sửa chúng. Bạn có thể đọc thông tin của lỗi hiện ra, và cũng có thể dùng thông tin đó tìm trên mạng(StackOverflow).

Và cũng có những lỗi mà không có bất cứ thông tin hay lỗi nào thực sự xuất hiện.

Ví dụ bạn viết:

print("Hello {name}") thì kết quả sẽ là Hello {name}, chỉ đơn giản là nó không đúng với cái bạn mong đợi Hello Thanh với name ở đây là Thanh.

Để sửa lỗi này, bạn cần phải xem lại các kiến thức mình đã học, cụ thể ở đây là dùng một biến trong chuỗi ký tự thì sẽ cần có f-strings, nên sửa lại là print(f"Hello {name}")

🛠 Dùng các công cụ hỗ trợ kiểm tra lỗi(print, log, debugger)

Cuối cùng, để kiểm tra chính xác từng kết quả khi chương trình thực thi, bạn có thể dùng các câu lệnh in ra màn hình(print) để kiểm tra các tham số, kết quả hay chỉ là chương trình đã chạy đến dòng nào đó hay chưa.

Debugger là một công cụ mạnh mẽ hơn cả print, nó giúp bạn đi qua từng dòng code và xem chương trình thực thi ra sao(với Python bạn có thể dùng pythontutor hay Thony, VSCode Debugger)


Trên đây là một vài note từ bài học gỡ lỗi mà mình học được. Nếu bạn có những cách gỡ lỗi nào hiệu quả thì giới thiệu đến mình và độc giả của BeautyOnCode với nhé.

Bài gốc của blog này nằm ở blog cá nhân của mình, mời bạn ghé chơi!

Nếu thích bạn cũng có thể follow fanpage này để nhận thông báo bài viết mới nhé.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thao tác với File trong Python

Python cung cấp các chức năng cơ bản và phương thức cần thiết để thao tác các file. Bài viết này tôi xin giới thiệu những thao tác cơ bản nhất với file trong Python.

0 0 48

- vừa được xem lúc

Tập tành crawl dữ liệu với Scrapy Framework

Lời mở đầu. Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 demo nho nhỏ.

0 0 149

- vừa được xem lúc

Sử dụng Misoca API (oauth2) với Python

Với bài viết này giúp chúng ta có thể nắm được. ・Tìm hiểu cách xử lý API misoca bằng Python.

0 0 36

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 3)

Tiếp tục phần 2 của series Pandas DataFrame nào. Let's go!!. Ở phần trước, các bạn đã biết được cách lấy dữ liệu một row hoặc column trong Pandas DataFame rồi phải không nào. 6 Hoc.

0 0 45

- vừa được xem lúc

Lập trình socket bằng Python

Socket là gì. Một chức năng khác của socket là giúp các tầng TCP hoặc TCP Layer định danh ứng dụng mà dữ liệu sẽ được gửi tới thông qua sự ràng buộc với một cổng port (thể hiện là một con số cụ thể), từ đó tiến hành kết nối giữa client và server.

0 0 56

- vừa được xem lúc

[Series Pandas DataFrame] Phân tích dữ liệu cùng Pandas (Phần 2)

Nào, chúng ta cùng đến với phần 2 của series Pandas DataFrame. Truy xuất Labels và Data. Bạn đã biết cách khởi tạo 1 DataFrame của mình, và giờ bạn có thể truy xuất thông tin từ đó. Với Pandas, bạn có thể thực hiện các thao tác sau:.

0 0 77