Biến đồng hồ python để thay đổi

Theo dõi các biến, sử dụng các điểm dừng có điều kiện, ngăn xếp cuộc gọi, điểm dừng ngoại lệ, v.v— khi làm việc trên các dự án lớn hơn

Kiểm tra xung nhanh — Bạn vẫn đang sử dụng các câu lệnh print() để gỡ lỗi mã của mình? . Nếu nó hoạt động, thì nó hoạt động (đặc biệt đối với các tập lệnh nhỏ hơn)

Phải nói rằng, đó không phải là một giải pháp bền vững khi làm việc với các dự án lớn hơn - liên quan đến vô số gói của bên thứ ba, thư mục sử dụng, thư mục, thư mục con - nơi rất dễ bị mất dấu dòng mã

Đây là động lực chính đằng sau việc học tất cả những điều cơ bản mà Mã VS phải cung cấp để gỡ lỗi mã. Đây là chia sẻ tương tự với bạn

Khái niệm cơ bản về trình gỡ lỗi VSCode

Để cho ngắn gọn, tôi sẽ giữ mọi thứ đơn giản và thảo luận đủ chi tiết để giúp bạn bắt đầu. Để biết thêm thông tin, vui lòng xem tài liệu chính thức của họ

dự án giả

Chúng tôi sẽ làm việc trên một dự án giả. Hiện tại, nó chứa một tập lệnh hello.py và một bộ dữ liệu audio_data giả nhỏ chứa 5 tệp âm thanh. Bạn có thể tìm thấy nó ở đây trên Github

GitHub - V-Sher/medium_debugger. Cách tận dụng tối đa trình gỡ lỗi VSCode

Bạn không thể thực hiện hành động đó vào lúc này. Bạn đã đăng nhập bằng tab hoặc cửa sổ khác. Bạn đã đăng xuất trong một tab khác hoặc…

github. com

Để kiểm tra độ chính xác, hãy chạy tập lệnh để xem đầu ra trong thiết bị đầu cuối của bạn

xin chào. py

Khởi chạy cấu hình

Hãy tiếp tục và tạo một tệp launch.json. Tham khảo tài liệu để biết các bước chi tiết

Khởi chạy cấu hình

Điều này sẽ tạo một thư mục .vscode mới trong dự án của bạn và sẽ chứa tệp launch.json, liệt kê tất cả các chi tiết thiết lập gỡ lỗi. Hiện tại, chúng tôi sẽ làm việc với các giá trị mặc định

Hãy bắt đầu gỡ lỗi

Để kiểm tra trạng thái của mã tại một dòng cụ thể, chúng ta phải thêm một điểm dừng cho nó. Chúng thường sẽ hiển thị dưới dạng các vòng tròn màu đỏ ở lề trình chỉnh sửa. Chẳng hạn, tôi đã thêm một điểm dừng tại vòng lặp ____6_______ (xem hình bên dưới)

Việc thêm một điểm dừng tại dòng X trong tập lệnh sẽ thực thi tất cả mã cho đến X và quá trình thực thi mã sẽ dừng tại X để bạn kiểm tra trạng thái mã của mình. Nói cách khác, mã ở dòng X sẽ không được thực thi cho đến khi bạn nhấp vào nút Tiếp tục (hoặc bất kỳ nút nào khác) trong

Thêm một điểm dừng tại vòng lặp for trong xin chào. py

Bây giờ, chúng ta có thể bắt đầu gỡ lỗi tập lệnh bằng cách nhấp vào nút phát màu xanh lá cây (Python:Current File trong hình trên). Thao tác này sẽ hiển thị hình nổi (xem hình bên dưới)

Thanh công cụ gỡ lỗi nổi

mẹo chuyên nghiệp. Đảm bảo bạn mở đúng tệp trong trình chỉnh sửa trước khi bắt đầu gỡ lỗi vì theo mặc định, trình gỡ lỗi sẽ bắt đầu gỡ lỗi tệp hiện đang hoạt động

Khi bắt đầu quá trình sửa lỗi, đây là những gì bạn sẽ thấy

Vài điều cần lưu ý

  • Ở bên trái, tab Variables được phổ biến với một số biến cục bộ và toàn cục
  • Ở bên phải, dòng mà điểm ngắt đầu tiên được thêm vào được đánh dấu bằng màu vàng trong tập lệnh
  • Trình gỡ lỗi chưa xử lý dòng mà điểm ngắt được thêm vào. (Mọi thứ cho đến thời điểm này đã được xử lý và đó là lý do tại sao bạn thấy mô-đun os là một phần của tab Variables. )

Kể từ đây, bạn có một số tùy chọn gỡ lỗi như một phần của thanh công cụ gỡ lỗi

  • Nút Tiếp tục sẽ đưa trình gỡ lỗi từ điểm dừng hiện tại (hoặc vòng tròn tô màu đỏ) sang vòng tròn tô màu đỏ tiếp theo (vì trong trường hợp của chúng ta có vòng lặp for, điểm dừng tiếp theo sẽ lại ở vòng lặp for)
  • Nút Bước qua sẽ đưa trình gỡ lỗi từ dòng hiện tại sang dòng tiếp theo trong mã (trong trường hợp của chúng ta là câu lệnh hello.py3)
  • Nút Bước vào sẽ đưa bạn vào bất kỳ chức năng nào được xác định trong điểm dừng hiện tại (trong trường hợp của chúng tôi là hello.py4 và hello.py5)
  • Các nút Khởi động lại và Dừng khá trực quan

nút tiếp tục

Nhấp vào nút Tiếp tục trong thanh công cụ gỡ lỗi sẽ thực thi mọi thứ cho đến điểm ngắt tiếp theo. Vì chúng ta đang ở trong một vòng lặp for nên điểm ngắt tiếp theo sẽ thực sự giống với điểm dừng hiện tại

Hãy thử làm điều này và xem những gì chúng ta nhận được

Ghi chú. Nếu chúng ta đã thêm một điểm dừng trong câu lệnh hello.py6 trong vòng lặp for, thì đây là nơi trình gỡ lỗi sẽ tạm dừng tiếp theo. )

Vài điều cần lưu ý

  • Ở bên trái, các biến hello.py7 đã được cập nhật và bây giờ chúng ta có thể thấy các giá trị của hello.py8 và hello.py9 cho lần lặp hiện tại trong vòng lặp audio_data0
    P. S. Bạn thậm chí có thể di chuột qua các biến này trong chính tập lệnh để xem giá trị của chúng
  • Trình gỡ lỗi hiện đang đánh dấu điểm dừng tiếp theo trong tập lệnh (là vòng lặp for giống như đã thảo luận ở trên)
  • Trong terminal, chúng ta có thể thấy một phần kết quả (từ lần lặp audio_data2) từ câu lệnh hello.py3

Bây giờ, chúng ta có thể tiếp tục nhấp vào tùy chọn Continue và chúng ta sẽ thấy các biến hello.py7 hello.py8 và hello.py9 được cập nhật với các giá trị tương ứng của chúng, cùng với các câu lệnh hello.py3 được liên kết. Nhưng nếu, bản thân vòng lặp for khá phức tạp và chúng tôi muốn tìm hiểu sâu về nó và gỡ lỗi thì sao?

Để thử điều đó, hiện tại chúng ta phải dừng trình gỡ lỗi (bằng cách sử dụng nút Dừng trên thanh công cụ gỡ lỗi) và thực hiện một số thay đổi đối với chính tập lệnh. Thay vì in tên tệp, bây giờ chúng ta sẽ in các đường dẫn tuyệt đối bằng cách sử dụng audio_data9 mà tôi đã gói gọn trong một hàm (vô dụng) có tên là launch.json0. Ngoài ra, id người nói cũng sẽ được trích xuất từ ​​tên tệp

xin chào. py

Như đã làm trước đây

  • chúng tôi đặt điểm dừng tại vòng lặp for
  • khởi động trình gỡ lỗi và nhấp vào nút Tiếp tục một lần để xem các biến cục bộ và biến toàn cầu được cập nhật thành launch.json2 và launch.json3 và một câu lệnh duy nhấthello.py3 trong thiết bị đầu cuối

Bây giờ, giả sử chúng ta muốn kiểm tra những gì đang diễn ra bên trong vòng lặp for. Một cách là đặt một điểm dừng khác HOẶC chúng ta có thể (thay vì nhấp vào nút Tiếp tục) chọn nút Bước qua trên thanh công cụ gỡ lỗi

Nút bước qua

Như tên cho thấy, trình gỡ lỗi đã chuyển sang dòng tiếp theo sau điểm ngắt (được đánh dấu bằng màu vàng)

Vài điều cần lưu ý

  • Sẽ không có bất kỳ câu lệnh hello.py3 nào trong thiết bị đầu cuối. Tại sao? . Bạn phải nhấp vào nút Tiếp tục (hoặc Bước qua) để xem đầu ra
  • Để kiểm tra giá trị của launch.json7 cho lần lặp này, chúng ta có thể nhấp vào nút Bước qua một lần nữa và bạn sẽ thấy một biến cục bộ mới có tên là launch.json7 được tạo (cùng với trình gỡ lỗi chuyển sang dòng tiếp theo và đánh dấu nó — xem hình bên dưới

  • Chúng tôi vẫn không thể kiểm tra những gì được trả về bằng phương pháp launch.json0. Giải pháp. Đặt điểm dừng
    Ghi chú. Không đặt điểm dừng tại dòng .vscode0 mà thay vào đó trong định nghĩa hàm (xem hình bên dưới)

Khi bạn đã đặt điểm ngắt, bạn có thể nhấp lại vào nút Bước qua và trình gỡ lỗi sẽ dừng ở câu lệnh .vscode1 trong hàm (xem hình bên dưới). Chúng ta có thể thấy các biến cục bộ hiện đã được cập nhật để chỉ phản ánh tham số .vscode2 mà hàm nhận được. Các biến trước đó như hello.py8, hello.py9 và launch.json7 giờ đã trở thành một phần của biến toàn cục

Đây là một cách tốt để kiểm tra xem các định nghĩa hàm có nhận được các đối số chính xác hay không. Tuy nhiên, chúng tôi vẫn không biết giá trị thực tế sẽ được trả về bởi launch.json0

Đây là nơi tôi cũ sẽ sử dụng câu lệnh hello.py3 trong chính mã đó

Thay vào đó, chúng ta có thể sử dụng chức năng Xem trong trình gỡ lỗi. Nhập biểu thức bạn muốn xem/lấy giá trị và nhấn Enter (xem hình bên dưới). Và thì đấy, bạn có thể thấy giá trị thực của biểu thức

Chức năng xem thường được sử dụng để xem giá trị của một biến thay đổi như thế nào trong toàn bộ mã, do đó có tên là đồng hồ. Chẳng hạn, bạn có thể sử dụng nó để theo dõi cách một hình ảnh đầu vào .vscode8 đi qua các lớp tích chập (và các lớp khác) để đưa ra một đầu ra duy nhất trong mạng thần kinh tích chập điển hình (CNN)

Kể từ đây, giờ đây bạn có thể hoàn tất việc điều hướng/gỡ lỗi thông qua mã của mình bằng nút Tiếp tục và Bước qua, cùng với chức năng Xem

Khi bạn đã hoàn thành, đã đến lúc thực hiện thêm một số thay đổi đối với mã. Chúng tôi sẽ cơ cấu lại mã và chuyển launch.json0 từ hello.py sang một tập lệnh launch.json1 mới sẽ nằm trong thư mục launch.json2 mới được tạo. Điểm dừng sẽ vẫn ở câu lệnh .vscode1 trong hàm

Nhanh chóng cập nhật mã để nhập phương thức trong vòng hello.py (nếu bạn lo lắng về việc nhập qua lại các mô-đun, vui lòng xem bài viết về nhập python của tôi)

xin chào. py

Bây giờ hãy thử gỡ lỗi tập lệnh hello.py theo cách thông thường và mặc dù điểm dừng thứ hai (bên trong launch.json1) không nằm trong tập lệnh hiện đang hoạt động (i. e. hello.py), trình gỡ lỗi sẽ vẫn hoạt động

Bước Vào/Ra nút

Khi đã ở trong điểm dừng tại launch.json1, giả sử vì tò mò, bạn cũng muốn kiểm tra hoạt động bên trong của audio_data9, đây là một chức năng thư viện tiêu chuẩn. Điều đó có nghĩa là bạn phải bước vào chức năng này và để thực hiện chúng ta có thể sử dụng nút Step Into trên thanh công cụ debug

Lý tưởng nhất là điều này sẽ đưa trình gỡ lỗi vào định nghĩa hàm bên trong mô-đun os. Tuy nhiên, bạn sẽ thấy rằng nó không xảy ra?
Tại sao?

Để bật gỡ lỗi mã không do người dùng viết, hãy đặt for1 thành for2 bên trong các cấu hình được mô tả trong launch.json

phóng. json

Bây giờ hãy thử khởi động lại trình gỡ lỗi và khi trình gỡ lỗi đạt đến điểm dừng .vscode1, hãy sử dụng nút Bước vào để khám phá for5. Sau khi vào bên trong, bạn có thể sử dụng nút Bước ra bất cứ lúc nào — giả sử bạn nghĩ rằng mình không muốn khám phá thêm — và trình gỡ lỗi sẽ quay trở lại điểm trước khi bạn bước vào, trong trường hợp của chúng tôi là câu lệnh .vscode1

Điểm dừng có điều kiện

Giả sử bạn đã hiểu cách thức hoạt động của trình gỡ lỗi khi xem xét một vài lần lặp lại vòng lặp for đầu tiên. Rõ ràng, đợi nó chạy xong tất cả các lần lặp lại không có ý nghĩa gì nhiều. Thay vào đó, chúng ta có thể để nó chạy mà không nhấn điểm ngắt cho đến khi nó đạt đến lần lặp cuối cùng

Đây là nơi các điểm dừng có điều kiện xuất hiện trong bức tranh. Hãy xem làm thế nào để làm điều đó. (Để đơn giản, chúng ta sẽ vô hiệu hóa breakpoint trong launch.json1. )

  • Nhấp chuột phải vào điểm dừng tại vòng lặp for và chọn Chỉnh sửa điểm dừng
  • Từ trình đơn thả xuống, chọn Biểu thức và đặt thành Python:Current File1
  • Nhấn Enter

Bây giờ, khi bạn khởi động lại trình gỡ lỗi, nó sẽ tự động bỏ qua bốn lần lặp lại đầu tiên và sẽ kích hoạt điểm dừng tại Python:Current File2 như minh họa trong hình bên dưới

mẹo chuyên nghiệp 1. Bạn cũng có thể chỉ định điểm ngắt để kích hoạt dựa trên số lần truy cập

Số lần truy cập đề cập đến số lần trình gỡ lỗi đã đạt đến một điểm dừng cụ thể

Chẳng hạn, bạn có thể chỉ muốn kích hoạt điểm dừng cho một số tệp cuối cùng (có thể là do bạn muốn kiểm tra chi tiết chúng). Bạn có thể làm như vậy bằng cách chọn Lượt truy cập từ menu thả xuống (thay vì Biểu thức) và đặt thành Python:Current File3. Điều này có nghĩa là điểm dừng sẽ chỉ kích hoạt sau ba lần xuất hiện đầu tiên và do đó chúng ta thấy ba câu lệnh in trong thiết bị đầu cuối tương ứng với Python:Current File4,Python:Current File5 và Python:Current File6

mẹo chuyên nghiệp 2. Chúng tôi thậm chí có thể ghi một thông báo (vào Bảng điều khiển gỡ lỗi) mỗi khi điểm ngắt được nhấn. Để làm như vậy, hãy chọn Thông báo nhật ký từ menu thả xuống (thay vì Biểu thức) và đặt nó thành một số văn bản thuần túy và/hoặc biểu thức sẽ được đánh giá trong dấu ngoặc nhọn. Ví dụ đơn giản, chúng ta sẽ ghi nhật ký giá trị cập nhật của Python:Current File7 bất cứ khi nào điểm dừng bị tấn công bằng cách đặt thông báo tường trình là Python:Current File8

ngăn xếp cuộc gọi

Thông thường, khi làm việc với các dự án lớn hơn, bạn rất dễ mất dấu dòng mã. Với rất nhiều điểm dừng, cuối cùng bạn có thể tự hỏi làm thế nào bạn kết thúc trong tệp này và quan trọng hơn, bạn kết thúc ở đây từ đâu

Vì ngăn xếp tuân theo thứ tự Đầu tiên Vào Cuối, nên Ngăn xếp Cuộc gọi của VSCode là hoàn hảo để theo dõi các điểm dừng trong quá trình gỡ lỗi

Trình gỡ lỗi VSCode có thể cung cấp một số trợ giúp về mặt đó bằng cách sử dụng cửa sổ Ngăn xếp cuộc gọi hiển thị phân cấp cuộc gọi

Để giới thiệu tiện ích, chúng tôi sẽ làm cho dự án hiện tại lớn hơn một chút bằng cách giới thiệu Python:Current File9 trong thư mục launch.json2

phía trên. py

Hãy nhanh chóng cập nhật launch.json1 để sử dụng hàm Variables2

cơ bụng. py

Nói chung, chúng ta sẽ thiết lập bốn điểm ngắt trong dự án của mình (xem hình bên dưới)

  • ở dòng 4 trong hello.py
  • ở dòng 5 và 6 trong launch.json1
  • ở dòng 2 trong Python:Current File9

Ví dụ giới thiệu tính năng Call Stack trong VSCode

Mặc dù đây có vẻ như là một ví dụ tầm thường, đây là cách chúng ta có thể xem xét hệ thống phân cấp cuộc gọi

  • Bắt đầu trình gỡ lỗi (đảm bảo màn hình đang hoạt động có chứa hello.py) và nhấn nút Tiếp tục cho đến khi bạn đạt đến điểm ngắt trong Python:Current File9
  • Hãy xem cửa sổ Call Stack (xem hình bên dưới)

Vài điều cần lưu ý

  • Ở trên cùng của ngăn xếp cuộc gọi sẽ là mô-đun (i. e. Variables2) và tên tệp ( Python:Current File9) cùng với số dòng (trong trường hợp của chúng tôi là dòng 2) chứa điểm dừng hiện tại
  • Ở vị trí thứ hai là số tệp/dòng mà điểm dừng hiện tại được gọi (trong trường hợp của chúng tôi là launch.json1, dòng 5)
  • Ở vị trí thứ ba là mô-đun ban đầu (hello.py ở dòng 6) được gọi là launch.json0 trong launch.json1 được gọi là mô-đun hiện tại (Variables2 trong os5)

Hy vọng rằng điều đó có ý nghĩa và không trở thành một trong những điều tôi biết rằng bạn biết rằng tôi biết rằng bạn biết…. Điều

Thưởng. Điểm dừng ngoại lệ

Thực hành lập trình tốt thực thi việc sử dụng xử lý lỗi bằng cách sử dụng các khối thử bắt. Do đó, trình gỡ lỗi có thể bỏ qua chúng và mã sẽ không bị hỏng. Nhưng điều gì sẽ xảy ra nếu bạn muốn dừng trình gỡ lỗi một cách rõ ràng bất cứ khi nào một ngoại lệ được đưa ra và/hoặc phát sinh

Điểm dừng ngoại lệ trong quá trình gỡ lỗi giúp làm nổi bật bất kỳ lỗi nào có thể không được chú ý chỉ vì chúng bị bắt trong khối bắt

Để chứng minh điều này, hãy thay đổi mã lần cuối và bao gồm một số khối thử-ngoại trừ

xin chào. py

Nếu bạn chạy tập lệnh độc lập này (không có trình gỡ lỗi), nó sẽ chạy tốt, không có bất kỳ lỗi nào. Mặc dù gặp sự cố khi không tìm thấy os6, nhưng nó sẽ được xử lý một cách im lặng vì os7 trong khối ngoại trừ

Phải nói rằng, có vẻ hữu ích khi phá vỡ VSCode trong những trường hợp như vậy. Để làm như vậy, hãy đi tới cửa sổ Điểm dừng và đảm bảo hộp kiểm bên cạnh Các ngoại lệ đã tăng được đánh dấu (Các ngoại lệ chưa được xử lý được kích hoạt theo mặc định)

Điểm dừng ngoại lệ

Bây giờ khi bạn thử chạy hello.py ở chế độ gỡ lỗi, mã sẽ bị hỏng ở khối thử

Breakpoint ExceptionKết luận

Gỡ lỗi là một trong những kỹ năng tôi học được dưới 80 của Pareto. quy tắc 20. Có thể mất một chút thời gian để tìm hiểu các khía cạnh khác nhau của nó nhưng một khi đã thành thạo, nó có thể được áp dụng cho tất cả các dự án mà bạn sẽ thực hiện. Một điều quan trọng cần lưu ý là chúng ta có thể đặt/chỉnh sửa bao nhiêu điểm dừng tùy ý trong khi trình gỡ lỗi đang chạy, tuy nhiên, chúng ta không thể tự thay đổi mã. Trước tiên, chúng tôi phải dừng trình gỡ lỗi, thực hiện các thay đổi rồi khởi động lại trình gỡ lỗi

Như mọi khi, nếu có một cách dễ dàng hơn để thực hiện/giải thích một số nội dung được đề cập trong bài viết này, hãy cho tôi biết. Nói chung, hãy kiềm chế những bình luận phá hoại/rác rưởi/thù địch không được yêu cầu

Cho đến lần sau ✨

Tôi thích viết hướng dẫn từng bước cho người mới bắt đầu, hướng dẫn cách thực hiện, câu hỏi phỏng vấn, giải mã thuật ngữ được sử dụng trong ML/AI, v.v. Nếu bạn muốn có toàn quyền truy cập vào tất cả các bài viết của tôi (và những bài khác trên Phương tiện), thì bạn có thể đăng ký bằng liên kết của tôi tại đây

Điểm canh gác trong Python là gì?

watchpoints là công cụ theo dõi biến/đối tượng trực quan, dễ sử dụng dành cho python hoạt động tương tự như watchpoints trong gdb.

Điểm ngắt trong Python là gì?

Điểm ngắt Python() - Dừng gỡ lỗi . hàm breakpointhook() sử dụng biến môi trường PYTHONBREAKPOINT để định cấu hình trình gỡ lỗi. Nếu không được đặt, trình gỡ lỗi PDB mặc định sẽ được sử dụng. Nếu nó được đặt thành “0” thì chức năng này sẽ trả về ngay lập tức và không có quá trình gỡ lỗi mã nào được thực hiện.

Bạn có thể gán lại giá trị cho một biến trong Python không?

Gán lại biến là một hành động Python gán giá trị cho một biến đã tham chiếu đến một giá trị . Kiểu gán lại biến phổ biến nhất là với câu lệnh gán. x = 1 x = 5 # Biến x được gán lại trên dòng này. Việc gán lại biến thay đổi đối tượng mà một biến đề cập đến.