Hướng dẫn python debug - gỡ lỗi python
4 Show
Giới thiệuGỡ lỗi (Debugging) là một trong những điều kinh khủng, khó ưa nhất trong phát triển phần mềm, nhưng điều ngang trái thay nó lại là một trong những thứ quan trọng bậc nhất trong vòng đời phát triển phần mềm. Chắc chắn trong giai đoạn phát triển, mọi lập trình viên đều phải tự debug mã của mình, điều này là không thể tránh khỏi. Có rất nhiều cách để debug một ứng dụng viết ra. Một phương pháp được sử dụng rất phổ biến đó là sử dụng câu lệnh "print" trong các trường hợp để xem nó chạy như thế nào trong khi thực thi chương trình. Tuy nhiên, phương pháp này xảy ra nhiều vấn đề, chẳng hạn như việc muốn in được các giá trị của biến thì phải thêm code vào, v.v.. => Quá phức tạp. Hơn nữa cách này chỉ dùng tạm bợ cho những chương trình nhỏ, tầm trăm dòng code trở lại thì ok, khi mà sang một chương trình lớn hơn, có nhiều file hơn, thì nó lại là một vấn đề lớn lớn lớn. Vậy thì, chúng ta đã có trình gỡ lỗi để giải quyết vấn đề đó cho. Nó giúp chúng ta tìm các lỗi trong một ứng dụng bằng các lệnh bên ngoài, do đó không có thay đổi nào đối với code. Như đã đề cập ở trên, mình muốn giới thiệu các bạn module PDB - một module tích hợp bên trong python (không cần phải cài đặt từ nguồn bên ngoài), thông qua bài viết "Có PDB, debug python không còn khó khăn". Mời các bạn đọc tiếp. Các lệnh thao tác cơ bảnĐể hiểu các lệnh hoặc công cụ chính có trong PDB, mình sẽ viết một đoạn chương trình nho nhỏ, vui vui, cơ bản, sau đó thử debug bằng các lệnh PDB. Bằng các này, chúng ta sẽ thấy được một cách rõ ràng hơn, chính xác hơn mỗi lệnh của PDB sẽ làm gì. 5
Kết quả của đoạn script trên:
Đoạn mã trên chắc mình cũng không cần phải giải thích nhiều, vì nó là basic đối với một người làm về python rồi, nó không có gì khó cũng như cú pháp phức tạp cả. Bạn không cần phải hiểu đoạn lệnh trên thực hiện, mục đích chính của mình thực hiện một số lệnh PDB dựa trên chương trình này. Ok, bắt đầu thôi. Sử dụng PDB yêu cầu sử dụng Command Line Interface (CLI), do đó bạn phải chạy ứng dụng của mình từ 6 hoặc 7.Chạy lệnh dưới đây trong CLI của bạn:
Trong lệnh trên, tên tệp 8, vì vậy bạn sẽ cần chèn tên tệp của bạn thay cho 8.Lưu ý: 0 là một cờ và nó thông báo cho Python rằng một mô-đun cần phải được imported; cờ này được theo sau bởi tên của mô-đun, trong trường hợp của trên của mình là pdb.Chạy xong lệnh sẽ hiển thị như thế này:
Đầu ra sẽ luôn có cùng cấu trúc. Nó sẽ bắt đầu với đường dẫn thư mục đến tệp mã nguồn. Sau đó, trong ngoặc, nó sẽ cho biết số dòng từ tệp mà PDB hiện đang trỏ tới, trong trường hợp của mình là 1. Dòng tiếp theo, bắt đầu bằng ký hiệu 2, cho biết dòng đang được trỏ đến.Để đóng PDB, chỉ cần nhập 3 hoặc 4.Một vài điều cần lưu ý, nếu chương trình của bạn có các tham số đầu vào, bạn cũng có thể chuyển chúng qua command line. Ví dụ, nếu chương trình của mình yêu cầu 3 đầu vào từ người dùng, thì lệnh của mình sẽ như thế này:
Tiếp tục, nếu trước đó bạn đã đóng PDB thông qua lệnh 3 hoặc 4, sau đó chạy lại tệp code thông qua PDB. Sau đó, chạy lệnh sau trong command line PDB:
Đầu ra trông như thế này:
Hiển thị 11 dòng đầu tiên của chương trình cho bạn, với dấu 2 hướng về dòng hiện tại đang được debug. Tiếp theo, hãy thử lệnh này trong command line PDB.
Lệnh này sẽ chỉ hiển thị các dòng được chọn, trong trường hợp này là các dòng 4 đến 6. Đây là đầu ra:
Debugging với Break pointsMột thứ quan trọng tiếp theo mà chúng ta sẽ tìm hiểu là 8. 8 thường được sử dụng cho các chương trình lớn hơn, nhưng để hiểu rõ hơn về nó, chúng ta sẽ tìm hiểu cách nó hoạt động dựa trên ví dụ cơ bản bên trên. 8 là các vị trí cụ thể mà chúng tôi khai báo trong code của mình. Code của tôi chạy đến vị trí đó và sau đó tạm dừng. Những điểm này được tự động gán số bởi PDB.Có các tùy chọn sau đây để tạo 8:
Để khai báo 8 theo số dòng, hãy chạy lệnh sau trong commandline PDB:
Lệnh này chèn một 8 ở dòng code thứ 8, nó sẽ tạm dừng chương trình một khi nó chạy tới điểm đó. Đầu ra lệnh này được hiển thị là: 0Để khai báo các 8 trên một hàm, hãy chạy lệnh sau: 1Để chèn một điểm dừng theo cách này, bạn phải khai báo nó bằng tên tệp và sau đó là tên hàm. Điều này xuất ra như sau: 2Như bạn thấy, 8 này đã được được tự động gán số 2 và số dòng là 4 - chính là tại dòng hàm được khai báo. 8 cũng có thể được khai báo bởi một điều kiện. Trong trường hợp đó, chương trình sẽ chạy cho đến khi điều kiện sai và sẽ tạm dừng khi điều kiện đó trở thành đúng. Chạy lệnh sau: 3Điều này sẽ theo dõi giá trị của biến 7 trong suốt quá trình thực thi và chỉ ngắt khi giá trị của nó là "Thi" ở dòng 6.Để xem tất cả các 8 mà mình đã khai báo dưới dạng danh sách, hãy chạy lệnh 4Kết quả sẽ có dạng: 5Cuối cùng, làm thế nào chúng ta có thể vô hiệu hóa, kích hoạt và xóa một 8 cụ thể tại bất kỳ trường hợp nào. Chạy lệnh sau: 6Lệnh trên sẽ vô hiệu hóa 8 2, nhưng sẽ không xóa nó khỏi phiên debug.Bạn sẽ thấy số 8 bị vô hiệu hóa. 7Cho phép xem lại danh sách tất cả các 8 để xem giá trị "End" cho 8 2: 4Đầu ra: 9Để kích hoạt 8 2: 0Và một lần nữa, đây là đầu ra: 1Bây giờ, nếu bạn in danh sách tất cả các điểm break, giá trị "End" của breakpoint 2 sẽ hiển thị 5.Bây giờ chúng ta hãy xóa breakpoint 1: 2Kết quả: 3Nếu chúng ta in lại danh sách các breakpoint, thì bây giờ sẽ chỉ hiển thị 2 breakpoint. Hãy kiểm tra bằng lệnh 6. 4Đúng như mong đợi. Trước khi làm điều tiếp theo, tôi muốn hiển thị ra kết quả khi chạy code cho đến khi breakpoint được đặt. Để làm điều đó, hãy xóa tất cả các breakpoint trước đó và khai báo một breakpoint khác thông qua commandline PDB:
Để chạy code, sử dụng 8, lệnh này sẽ thực thi code cho đến khi chạm breakpoint hoặc kết thúc: 8Bạn sẽ thấy: 9Chương trình chạy cho đến breakpoint và tạm dừng, bây giờ tùy thuộc vào chúng ta muốn thay đổi bất cứ điều gì, kiểm tra các kiến hoặc nếu chúng ta muốn chạy tập lệnh cho đến khi hết hoàn thành. Hãy chạy lệnh 8.Kết quả: 0Nếu chúng ta in lại danh sách các breakpoint, thì bây giờ sẽ chỉ hiển thị 2 breakpoint. Hãy kiểm tra bằng lệnh 6.Đúng như mong đợi. Trước khi di chuyển về phía trước, hãy xóa tất cả các breakpoint bằng cách chạy lệnh 0, sau đó nhập 1 vào commandline PDB.Trước khi làm điều tiếp theo, tôi muốn hiển thị ra kết quả khi chạy code cho đến khi breakpoint được đặt. Để làm điều đó, hãy xóa tất cả các breakpoint trước đó và khai báo một breakpoint khác thông qua commandline PDB:Xóa tất cả các breakpoint Sau đó, nhập "y" và nhấn "ENter". Bạn sẽ thấy kết quả xuất hiện: Khai báo một breakpoint mới Mình sẽ chạy cho đến khi giá trị của biến 7 bằng "Thi". Vì vậy, về cơ bản, chương trình sẽ tạm dừng trước chữ "Lê".
Chạy cho đến breakpoint 2Để chạy code, sử dụng 8, lệnh này sẽ thực thi code cho đến khi chạm breakpoint hoặc kết thúc: 3Bạn sẽ thấy: Chương trình chạy cho đến breakpoint và tạm dừng, bây giờ tùy thuộc vào chúng ta muốn thay đổi bất cứ điều gì, kiểm tra các kiến hoặc nếu chúng ta muốn chạy tập lệnh cho đến khi hết hoàn thành. Hãy chạy lệnh 8.Trong kết quả trên, có thể thấy chương trình tiếp tục từ breakpoint, chạy phần còn lại và sau đó khởi động lại để cho phép chúng ta debug thêm nếu muốn. Bây giờ chuyển sang phần tiếp nha.Lưu ý quan trọng: Trước khi di chuyển về phía trước, hãy xóa tất cả các breakpoint bằng cách chạy lệnh 0, sau đó nhập 1 vào commandline PDB.Chức năng Next và Step |