1.Leetcode 383
Ch4 使用vscode连接开发机进行python debug
4.1 什么是debug?
当你刚开始学习Python编程时,可能会遇到代码不按预期运行的情况。这时,你就需要用到“debug”了。简单来说,“debug”就是能再程序中设置中断点并支持一行一行地运行代码,观测程序中变量的变化,然后找出并修正代码中的错误。而VSCode提供了一个非常方便的debug工具,可以帮助你更容易地找到和修复错误。
4.2 使用Vscode进行Python debug的流程
4.2.1 debug单个python文件
def range_sum(start,end):
sum_res = 0
for i in range(start,end):
sum_res+=i
return sum_res
if __name__ =="__main__":
print(range_sum(1,10))
Step1.安装Python扩展
- 打开VSCode,点击左侧扩展栏,搜索Python,并安装。
Step2配置调试
- 打开你的Python文件,点击左侧活动栏的“运行和调试”图标。
- 首次debug需要配置以下,点击“create a launch.json file”,选择python debugger后选择“Python File” config。
- 可以直接编辑生成的launch.json文件,配置调试参数,比如添加config(Add Configuration)等。
- 新建python文件后我们如果想要运行,首先需要选择解释器。单击右下角的select interpreter,vsconde会自动扫描开发机上所有的python环境中的解释器。
Step3.设置断点
在代码行号旁边点击,可以添加一个红点,这就是断点(如果不能添加红点需要检查一下Python扩展是否已经正确安装)。当代码运行到这里时,它会停下来,这样你就可以检查变量的值、执行步骤等。接下来,我们在第4行的核心代码处打上断点。
Step4.启动debug
点击VSCode侧边栏的“Run and Debug”(运行和调试),选择调试配置后,点击绿色箭头(开始调试)按钮,或者按F5键。
Step5.查看变量
当代码在断点处停下来时,你可以查看和修改变量的值。在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。
Step6.单步执行代码
你可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。
debug面板各按钮功能介绍:
-
continue
: 继续运行到下一个断点。 -
step over
: 单步跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。 -
step into
: 单步进入。如果当前行代码存在函数调用,则进入该函数内部。如果当前行代码没有函数调用,则等价于step over
。 -
step out
: 单步退出函数,返回到调用该函数的上一层代码。 -
restart
: 重新启动调试。 -
stop
: 终止调试。
Step7.修复错误并重新运行
如果你找到了代码中的错误,可以修复它,然后重新运行debug来确保问题已经被解决。
通过遵循以上步骤,你可以使用VSCode的debug功能来更容易地找到和修复你Python代码中的错误。可以自己编写一个简单的python脚本,并尝试使用debug来更好的理解代码的运行逻辑。记住,debug是编程中非常重要的一部分,所以不要怕花时间在这上面。随着时间的推移,你会变得越来越擅长它!
4.2.2 不同的断点
在调试(Debug)过程中,断点(Breakpoint)允许程序员在程序的执行流程中设置暂停点。当程序运行到这些断点时,执行会暂时中断,使得我们可以检查此时程序的状态,包括变量的值、内存的内容等。断点为我们提供了一个观察程序运行细节的机会,从而帮助我们定位和解决程序中的错误或问题。在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。
- 普通断点:在代码行号左侧点击,添加断点。
- 条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
- 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:
x == 10
- 触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
- 记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用
{}
将表达式括起来。例如,每次记录变量i
的值可以写x={i}
。
- 表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:
表达式条件断点
比如我们想让代码在 i=end-1
时停下来,可以这样设置: 在断点处右键选择“条件断点”,然后输入条件 i == end-1
。
回车保存断点,然后运行debug,可以看到程序在i=9的时候停了下来,此时各变量的值如下
触发计数条件断点
如果我们想让sum_res+=i在运行5次后停下来,我们可以在这行设置Hit count
断点为5。
运行debug后,程序第一次暂停时各变量的状态为
记录日志条件断点
在Log Message输入 Current i is {i}
每次触发时记录一下 i 的值
运行debug后我们可以在终端面板的debug console看到
4.3 在vscode使用命令行进行debug
很多时候我们要debug的不止是一个简单的python文件,而是很多参数,参数中不止会有简单的值还可能有错综复杂的文件关系,甚至debug一整个项目。这种情况下,直接使用命令行来发起debug会是一个更好的选择。
4.3.1 vscode设置
vscode支持通过remote的方法连接我们在命令行中发起的debug server。首先我们要配置一下debug的config。
还是点击VSCode侧边栏的“Run and Debug”(运行和调试),单击"create a lauch.json file"
选择debugger时选择python debugger。选择debug config时选择remote attach就行,随后会让我们选择debug server的地址,因为我们是在本地debug,所以全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678。
配置完以后会打开配置的json文件,但这不是重点,可以关掉。这时我们会看到run and debug界面有变化,出现了debug选项。
![]() |
注意:已经有配置好的json文件
如果有已经配置好的debug json配置文件,则需要在原json上增加配置。可以通过Run and Debug
卡片左上角的下拉菜单单击Add configuration
,或者点击设置按钮打开配置文件,在配置文件的右下角也会有一个Add configuration
。剩下的步骤就和前面一样选择Python debugger
-Remote attach
,剩下的全都保持默认直接回车就可以了,也就是我们的server地址为 localhost:5678。
![]() |
4.3.2 debug命令行
现在vscode已经准备就绪,让我们来看看如何在命令行中发起debug。如果没有安装debugpy的话可以先通过pip install debugpy安装一下。
python -m debugpy --listen 5678 --wait-for-client ./myscript.py
-
./myscript.py
可以替换为我们想要debug的python文件,后面可以和直接在命令行中启动python一样跟上输入的参数。记得要先在想要debug的python文件打好断点并保存。 -
--wait-for-client
参数会让我们的debug server在等客户端连入后才开始运行debug。在这就是要等到我们在run and debug界面启动debug。
注意: 在开发机上使用该debug方式运行的时候可能会报以下warning
。此时,debug可能不能正常运行,需要按他提示的给python加上-Xfrozen_modules=off
参数禁用冻结模块即可。
Debugger warning: It seems that frozen modules are being used, which may make the debugger miss breakpoints. Please pass -Xfrozen_modules=off to python to disable frozen modules.
python -m -Xfrozen_modules=off debugpy --listen 5678 --wait-for-client ./myscript.py
先在终端中发起debug server,然后再去vscode debug页面单击一下绿色箭头开启debug。
![]() |
接下来的操作就和上面一样了。
4.3.3 使用别名简化命令
这边有个不方便的地方,python -m debugpy --listen 5678 --wait-for-client这个命令太长了,每次都打很麻烦。这里我们可以给这段常用的命令设置一个别名。
在linux
系统中,可以对 ~/.bashrc 文件中添加以下命令
alias pyd='python -m debugpy --wait-for-client --listen 5678'
然后执行
source ~/.bashrc
这样之后使用 pyd 命令(你可以自己命名) 替代 python 就能在命令行中起debug了,之前的debug命令就变成了
pyd ./myscript.py