条件断点只能写纯表达式,不能写语句;vs code 每次执行到该行时求值表达式,为 true 才暂停,禁止 print、赋值、if、注释等副作用操作。

条件断点只能写表达式,不能写语句
VS Code 的条件断点本质是「每次执行到该行时,先求值你写的表达式,为 True 才暂停」。它不是 Python 的 if 块,不支持任何副作用操作。
常见错误包括:print(x)、x += 1、if x > 5:、# 注释 —— 这些都会让断点失效或直接报错。
-
epoch == 5✅ 合法:纯比较表达式 -
"train" in mode✅ 合法:成员判断 loss ✅ 合法:复合条件-
len(data) > 100✅ 合法:函数调用(只要无副作用)
注意:data.append(1) 或 os.system("ls") 这类会改变状态或触发系统调用的调用,一律禁止。
日志点(Logpoint)支持变量插值但不支持函数调用
日志点本质是运行时不暂停、只往 Debug Console 输出字符串,靠的是调试器对表达式的求值能力,所以插值语法 {x} 或 {loss:.4f} 能用,但背后必须是「可安全求值」的表达式。
容易踩坑的地方:
-
{model.predict(x)}❌ 模型预测可能耗时、有副作用、甚至崩溃,调试器不保证执行环境完整 -
{os.getcwd()}❌ 系统调用不被允许,会报Expression evaluation error -
{x.shape if hasattr(x, "shape") else "N/A"}✅ 条件表达式合法,但需确保x在当前作用域存在且非None -
Batch {batch_idx}: loss = {loss.item():.3f}✅ 训练循环中最常用、最稳妥的写法
中文日志没问题,比如 第{i}次迭代,结果为{result},只要大括号内是合法表达式即可。
Hit Count 断点适合跳过前 N 次循环
当你要观察循环第 100 次、第 1000 次的行为,又不想手动按 99 次 F5,就用命中次数断点。
设置方式:右键断点 → Hit Count → 输入数字(如 100)。
- 输入
100:前 99 次忽略,第 100 次暂停 - 输入
> 100:从第 101 次起每次暂停 - 输入
% 10 == 0:每 10 次暂停一次(注意语法是调试器支持的简写,非 Python 原生)
这个功能在数据加载、训练 epoch、批量处理等场景下非常实用,但别和条件断点叠加使用——两者逻辑不同,叠加反而难调试。
launch.json 中无需额外配置,但解释器必须正确
条件断点和日志点是 VS Code 调试 UI 层功能,不依赖 launch.json 特殊字段。但前提是 Python 扩展能正常 attach 到进程,否则断点图标会变灰、不生效。
检查点:
- 按
Ctrl+Shift+P→Python: Select Interpreter,确认选中的是你实际运行代码的环境(比如venv/bin/python) - 如果用了
conda或 Poetry,确保对应环境已激活且被 VS Code 识别 -
launch.json中的"program": "${file}"要匹配你当前正在调试的文件,否则断点位置可能错位
断点图标变空心红圈、或 Debug Console 显示 Breakpoint ignored,八成是解释器没选对,而不是断点写错了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











