VSCode 1.75+ 通过启用 launch.json 中的 "subProcess": true、使用 spawn 启动方法、将子进程函数定义在模块顶层,可实现 multiprocessing 子进程断点调试。

VSCode 默认调试器无法直接跟踪 multiprocessing 子进程,因为子进程是独立启动的,不继承父进程的调试上下文。但通过配置,可以实现对主进程和关键子进程的断点调试。
启用子进程调试支持
VSCode 1.75+ 内置了对 Python 多进程调试的支持,前提是使用 debugpy(VSCode Python 扩展默认调试后端)并开启 subProcess 选项。
- 确保已安装最新版 Python 扩展 和
debugpy(通常自动安装) - 在
.vscode/launch.json中,为 Python 配置添加"subProcess": true - 完整示例配置:
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File (with subprocesses)",
"type": "python",
"request": "launch",
"module": "your_main_module", // 或用 "program": "${file}" 启动当前文件
"console": "integratedTerminal",
"justMyCode": true,
"subProcess": true
}
]
}
正确启动 multiprocessing 代码
不是所有启动方式都支持子进程调试。必须满足两个条件:使用 spawn 或 forkserver 启动方法(Windows 只支持 spawn),且子进程入口函数需可被模块导入(不能仅在 if __name__ == '__main__': 下定义)。
- 推荐显式指定启动方法:
mp.set_start_method('spawn')(尤其在 Windows 或 macOS 上) - 将子进程执行的函数定义在模块顶层(不要嵌套在
main()或条件块里) - 避免使用
os.fork()或自定义 fork 行为,debugpy 不拦截原生 fork
在子进程中设置断点
启用 "subProcess": true 后,VSCode 会自动附加到由 multiprocessing 启动的新 Python 进程(只要它们调用 debugpy.listen() 或继承父进程调试环境)。
立即学习“Python免费学习笔记(深入)”;
- 断点可以直接打在子进程执行的函数内部(例如
worker_func()),无需额外代码 - 如果断点未命中,检查终端是否输出类似
Debug adapter response: {"seq":...},确认子进程已连接调试器 - 可在子进程函数开头加
import debugpy; debugpy.breakpoint()强制中断(需提前debugpy.listen(5678))
常见问题与绕行技巧
某些场景(如第三方库启动进程、动态生成代码)仍可能无法自动附加。这时可手动控制调试流程:
- 临时把多进程逻辑改为单进程运行(注释掉
Pool/Process,直接调用函数),快速验证逻辑 - 对关键子进程,改用
threading模拟(仅用于调试,非生产) - 在子进程中写日志 +
time.sleep(),配合print()定位问题,再恢复断点 - 使用
logging.debug()并开启 VSCode 的 Python 日志("logToFile": true)辅助分析
基本上就这些。核心是开 subProcess、用 spawn、函数可导入——三者齐备,大部分多进程调试就能顺利进行。










