一、调试前的准备工作
1. 准备一段测试代码
先写一个简单的Python脚本(比如计算阶乘),故意留点问题:
def factorial(n):
result = 1
for i in range(n):
result *= i
return result
print(factorial(5)) # 预期输出120,但实际输出0?
2. 为什么需要调试?
- 当代码运行结果不符合预期时,调试能帮你逐行跟踪代码执行过程。
- 可以查看变量值的变化,找出逻辑错误。
二、调试核心操作(带截图步骤)
1. 设置断点(Breakpoint)
作用:让程序运行到此处时暂停,方便观察。
操作:在代码行号左侧单击,出现红点(如图)。
https://example.com/breakpoint.png
(示例:在第3行result = 1
和第5行result *= i
设置断点)
2. 启动调试模式
- 方法1:点击右上角的绿色甲虫图标 🐞。
- 方法2:右键代码 → 选择
Debug '文件名'
。
3. 调试界面布局
启动调试后,PyCharm 会自动进入调试视图,主要分为:
① 调试工具栏:控制代码执行(步进、恢复等)。
② 变量窗口(Variables):显示当前作用域内的变量值。
③ 控制台(Console):显示程序输出和输入。
https://example.com/debug-layout.png
三、关键调试按钮详解
按钮图标 | 名称 | 快捷键 | 作用说明 |
---|---|---|---|
▶️ | Resume | F9 | 继续执行程序,直到下一个断点或结束。 |
➡️ | Step Over | F8 | 执行当前行代码,不进入函数或循环内部。 |
⬇️ | Step Into | F7 | 执行当前行代码,进入函数内部(比如调试自定义函数时用)。 |
⬆️ | Step Out | Shift+F8 | 从当前函数内部跳出,回到调用它的位置。 |
🛑 | Stop | Ctrl+F2 | 终止调试进程。 |
四、实际调试流程(以示例代码为例)
1. 第一次暂停(断点:第3行)
- 观察变量窗口:此时
n=5
,result=1
(正确)。 - 点击
Step Over
(F8):执行result = 1
。
2. 进入循环(断点:第5行)
- 点击
Step Over
(F8)多次,观察每次循环时i
和result
的变化:- 问题暴露:第一次循环时
i=0
,导致result *= 0
,结果变为0! - 错误原因:
range(n)
生成的是[0,1,2,3,4]
,应从1
开始循环。
- 问题暴露:第一次循环时
3. 修复代码
修改循环范围:for i in range(1, n+1):
五、调试进阶技巧
1. 条件断点(Conditional Breakpoint)
- 作用:当满足特定条件时暂停。
- 设置:右键断点 → 输入条件(如
i == 3
)。
2. 监视表达式(Watches)
- 作用:实时监控某个变量或表达式的值。
- 操作:在
Watches
窗口点击+
→ 输入表达式(如i * 2
)。
3. 重新运行调试
- 修改代码后无需关闭调试,直接点击调试按钮重新启动。
六、常见问题排查
1. 调试时程序没有暂停?
- 检查是否设置了断点。
- 确保代码确实执行到了断点位置。
2. 变量窗口没有显示值?
- 确认程序已暂停在断点处。
- 检查变量是否在当前作用域内(比如循环内部变量需在循环中查看)。
3. 如何调试报错行?
- 当程序抛出异常时,PyCharm 会自动跳转到错误行,并显示堆栈信息。
七、总结:调试的核心思路
- 定位问题区域:通过错误提示或日志缩小范围。
- 设置断点:在可疑代码前后暂停。
- 逐行跟踪:观察变量是否符合预期。
- 验证修复:修改后重复调试直到正确。