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 tabVariables
. ]
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ặpfor
] - 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.py
3] - 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.py
4 vàhello.py
5] - 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.py
6 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.py
7 đã được cập nhật và bây giờ chúng ta có thể thấy các giá trị củahello.py
8 vàhello.py
9 cho lần lặp hiện tại trong vòng lặpaudio_data
0
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_data
2] từ câu lệnhhello.py
3
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.py
7 hello.py
8 và hello.py
9 đượ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.py
3 đượ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_data
9 mà tôi đã gói gọn trong một hàm [vô dụng] có tên là launch.json
0. 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.json
2 vàlaunch.json
3 và một câu lệnh duy nhấthello.py
3 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.py
3 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.json
7 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.json
7 đượ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.json
0. Giải pháp. Đặt điểm dừng
Ghi chú. Không đặt điểm dừng tại dòng.vscode
0 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 .vscode
1 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ố .vscode
2 mà hàm nhận được. Các biến trước đó như hello.py
8, hello.py
9 và launch.json
7 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.json
0
Đây là nơi tôi cũ sẽ sử dụng câu lệnh hello.py
3 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
.vscode
8 đ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.json
0 từ hello.py
sang một tập lệnh launch.json
1 mới sẽ nằm trong thư mục launch.json
2 mới được tạo. Điểm dừng sẽ vẫn ở câu lệnh .vscode
1 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.json
1] 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.json
1, giả sử vì tò mò, bạn cũng muốn kiểm tra hoạt động bên trong của audio_data
9, đâ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 for
1 thành for
2 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 .vscode
1, hãy sử dụng nút Bước vào để khám phá for
5. 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 .vscode
1
Đ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.json
1. ]
- 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 File
1 - 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 File
2 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 File
3. Đ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 File
4,Python:Current File
5 và Python:Current File
6
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 File
7 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 File
8
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 File
9 trong thư mục launch.json
2
phía trên. py
Hãy nhanh chóng cập nhật launch.json
1 để sử dụng hàm Variables
2
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.json
1 - ở dòng 2 trong
Python:Current File
9
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 trongPython:Current File
9 - 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.
Variables
2] và tên tệp [Python:Current File
9] 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.json
1, dòng 5] - Ở vị trí thứ ba là mô-đun ban đầu [
hello.py
ở dòng 6] được gọi làlaunch.json
0 tronglaunch.json
1 được gọi là mô-đun hiện tại [Variables
2 trongos
5]
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 os
6, nhưng nó sẽ được xử lý một cách im lặng vì os
7 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