VSCode调试核心是断点精准暂停与变量实时查看:设断点可直接观察model.generate()前input_ids等变量;条件断点、日志点提升效率;异常时自动停在源头并展开调用栈;Problems面板前置拦截语法/类型错误;需配置正确解释器、控制台输出及日志方式。

断点停在哪,变量就看得到
VSCode 调试不是“运行完再猜”,而是让程序在你指定的位置暂停,直接暴露当时所有变量的真实值。比如你在 model.generate() 前设断点,就能立刻看到 input_ids 是否为空、attention_mask 形状是否匹配——这比靠日志拼凑状态快得多。
- 普通断点适合确定位置:点击行号左侧灰色区域,出现红点即生效
- 条件断点防干扰:右键断点 → “编辑断点” → 输入
i == 10,只在第 10 次循环中断 - 日志点不打断执行:右键断点 → “编辑断点” → 勾选“日志消息”,输入
step: {i}, loss: {loss.item():.4f},自动打印不暂停
常见坑:断点设在被优化掉的代码行(如空函数体、未使用的变量赋值),或 Python 脚本未以模块方式运行(python -m 启动更稳定)。
错误一发生,调试器就跳到源头
当抛出 RuntimeError: size mismatch 或 CUDA out of memory,VSCode 不会只显示 traceback 最后一行,而是直接停在触发异常的那一行,并展开完整调用栈(Call Stack 面板)。你点任意一层,就能看到对应函数里的局部变量和参数。
- 确保
launch.json中"justMyCode": true(默认),避免跳进库源码干扰判断 - 若异常被
try/except吞掉,可在调试设置里勾选“仅在未处理异常时中断”(Breakpoints 面板 → “Python Exception Breakpoints”) - 对 PyTorch 模型,常需检查
tensor.device和tensor.dtype,这些在“变量”面板里点开就能核对,不用手写print()
问题面板(Problems)是错误的第一道过滤器
很多错误根本不用跑起来——VSCode 的 Problems 面板会在你保存时实时标出语法错、类型不匹配、未声明变量等,比调试器更早介入。它不是辅助,是前置防线。
- 快捷键
Ctrl+Shift+M呼出,点击任一条目直接跳转到错误行 - 配合
Pylint或pyright扩展,能提前发现text_encoder.encode()返回None导致后续崩溃的问题 - 悬停在波浪线下方,出现灯泡图标 → 点击可自动插入
import、补全类型注解、甚至修复缩进
容易忽略的一点:如果 Problems 面板空白但明显有错,先执行命令 Developer: Restart Extension Host,语言服务器卡住会导致诊断失效。
调试日志和控制台输出必须对齐
调试时看到的 print() 输出和变量值不一致?大概率是日志没进调试控制台。默认情况下,终端(Terminal)和调试器(Debug Console)是两个独立输出流,异步任务或子进程的日志容易丢失。
- 在
launch.json中明确配置:"console": "internalConsole"(推荐)或"console": "integratedTerminal"+"outputCapture": "std" - 对多进程场景(如 DataLoader),用
logging替代print,并加%(process)d标记,避免日志混杂 - 调试控制台支持直接执行表达式:暂停时输入
len(batch["input_ids"])回车,立刻得结果,不用改代码再重跑
最常被跳过的细节:没确认 Python 解释器路径是否指向你实际运行模型的那个环境(Ctrl+Shift+P → “Python: Select Interpreter”),选错解释器,断点根本不会命中,变量也全是空的。










