断点不生效主因是调试未真正启动:debugpy未安装、解释器路径错误或launch.json配置错误;须确认debugpy已装、状态栏显示真实解释器路径、f5启动而非code runner;launch.json中"type"、"program"/"module"、"console"三项必须正确;多线程需同时设"subprocess":true和"justmycode":false。

断点不生效,90% 是因为调试根本没真正跑起来——debugpy 没加载、解释器错位、launch.json 配置错三处之一出问题,就会全程静默跳过。
为什么 F5 启动后断点完全不触发
VSCode 行号旁的实心红点只是标记,不是执行指令。它要起作用,必须满足三个硬性条件:
-
debugpy必须已安装:运行python -m pip install debugpy,别依赖 Python 扩展自动装(某些精简环境会漏) - 底部状态栏必须显示真实解释器路径(如
C:\myproj\.venv\Scripts\python.exe),不能是模糊的“Python 3.11.9 64-bit” - 你按的是
F5或左侧调试图标里的 ▶️,不是右上角 Code Runner 的绿色三角——后者根本不走调试协议,纯终端执行
常见现象:F5 启动后控制台刷完日志就退出,光标没停在断点行。这时先查这三项,比反复重打断点更有效。
launch.json 中必须核对的三项配置
其他字段可后续加,但以下三项写错,断点基本废掉:
-
"type": "python":大小写敏感,不能写成"Type"或"Python" -
"program": "${file}"或"module": "mypackage.main":前者适合单脚本(如main.py),后者适合包结构(如用python -m mypackage.cli启动);混用会导致模块导入失败,断点白设 -
"console": "integratedTerminal":设成"externalTerminal"在 Windows 上极易因权限/路径失败;先用集成终端保底
如果项目源码在 src/ 下,还建议显式加 "cwd": "${workspaceFolder}/src",否则 import myproject.core 会报 ModuleNotFoundError。
多线程断点始终不命中?缺这两个开关
VS Code 默认不调试子线程,必须在 launch.json 中同时启用:
-
"subProcess": true:让debugpy监听所有派生线程(含threading.Thread和concurrent.futures.ThreadPoolExecutor) -
"justMyCode": false:避免调试器把线程函数误判为第三方代码跳过(尤其当目标函数是lambda或嵌套在标准库调用链里时)
两者缺一不可;只开 subProcess 会导致断点变空心圆,只开 justMyCode 则子线程压根不进调试上下文。修改后必须重启整个调试会话,热重载不生效。
变量看不清或子线程局部变量消失?切换调用栈帧
VSCode 调试界面默认只显示当前选中的调用栈帧对应的变量,不是所有线程变量的合并视图:
- 调试暂停后,左侧
CALL STACK面板会列出MainThread、Thread-1、Thread-2等——点击任一名称,Variables面板立即切换为其局部作用域 - 断点必须打在子线程函数体第一行可执行语句上(比如
print("in thread")),而不是threading.Thread(target=).start()那一行 - 全局变量(模块级或
global声明的)在任意线程下都可见,但值是最新写入状态,不是快照,注意竞态
没暂停的线程(如卡在 time.sleep(5) 中)不会出现在 CALL STACK 里,这是正常行为,不是调试器限制。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











